1

メソッドが呼び出されると、JVM はメソッドに割り当てる領域を認識します。

しかし、次のようなコードがある場合:

while(someCondition) {
   Path p = someMethodThatReturnsAPath();
    //do some things
}

スタック上で何が起こっていますか?これは何が起こるのですか?:

  • リストを指すスタック上のポインターを作成します (メソッドから返されたパスを指すポインター)
  • いくつかのことが行われます
  • p、または「Path オブジェクトへのポインターへのポインター」がスタックから削除されます
  • 繰り返す

上記のコードと:

Path p = null;
while(someCondition) {
    p = someMethodThatReturnsAPath();
    //do some things
}
4

2 に答える 2

0

メソッドに必要なすべてのスタックは、メソッドに入るときに割り当てられ、メソッドから出るときに割り当てが解除されます。生成されたバイトコードを参照してください。内部ブロックの出入りに対応するバイトコード命令はありません。ローカル変数のバイトコードは、既存のスタック スロットを番号で参照するだけです。

したがって、ポインターは「スタックから削除」されることはありません。スタック スロットは、内部ブロックのスコープ外の後続の宣言によって再利用される可能性があります。これは別のことです。

他の回答やコメントとは対照的に、ホットスポットはどこにも入らないことに注意してください。HotSpot は、存在しない命令を最適化できません。(ただし、存在するコードを削除することはできます。)

于 2013-04-11T23:42:16.223 に答える