2017-10-12 8 views
1

(およびhttps://www.javaworld.com/article/2076949/learn-java/how-the-java-virtual-machine-handles-method-invocation-and-return.html?page=2による)、JVMは、メソッド呼び出しを処理します。Javaのメソッド呼び出しスタックのコピー

なぜ、スタックフレーム間で引数をコピー/移動する必要がありますか?

呼び出し元の最上位スロット(引数を含む)が呼び出し先スタックフレームの最下位スロットになるように、呼び出し元の新しい重複スタックフレームを作成する方が簡単ではないでしょうか。後ですべてを消去する限り(ポップすることによって)、コピーを避けることでメソッド呼び出しの効率を上げても差はありません。

だから、どういう問題がありますか?このようにしないといけませんか?

答えて

2

あなたが引用した部分は、正式なプロセスを説明しています。実装はその記述と互換性がなければなりませんが、文字通りその記述に似る必要はありません。

あなただけを超えていくつかの文章を読めば、あなたが見つかりましたでしょう:

をJVM仕様は、Javaスタックのための特定の実装を必要としません。フレームはヒープから個別に割り当てることも、連続したメモリから取り出すこともできますし、両方を行うこともできます。必ずしもすべての実装はあなたが提案のようにそれを最適化することができた理由を説明

が、

2つのフレームが、しかし、仮想マシンはちょうど彼らがそのようなことの連続する重複することができますされている場合のオペランドスタックの最上位1つのフレームは、次のローカル変数の下端を形成します。このスキームでは、2つのフレームが重なっているため、仮想マシンはobjectrefとargsを1つのフレームから別のものにコピーする必要はありません。呼び出し元のメソッドのフレーム内のobjectrefを含むオペランドスタックワードは、新しいフレームのローカル変数0と同じメモリ位置になります。

実際、この最適化の機会が明示的に言及されているので、あなたが提案した方法では実装されないと誰も言わなかった。しかし、この記事では、具体的なJVMがどのようにスタックを実装しているかは説明していません。

呼び出し元にインライン化されていない場合は、最適化されたホットスポットに対して呼び出しプロトコルが完全に異なる可能性があります。これは、すべての呼び出しアーティファクトを完全に削除します。

関連する問題