2012-10-12 11 views
7

私は興味があります。
while/forループ内で参照を定義するとします。JAVA:ループ内で定義された参照

JVMはすべての繰り返しについてこのリファレンスを定義しますか、それとも1回のみ定義するように最適化されていますか?

+2

「定義する」とはどういう意味ですか?それは本当にあなたが意味することに依存します。変数は毎回再初期化されますが、メモリスペースはおそらく再利用されます。 –

+1

"参照を定義する"とはどういう意味ですか?厳密に言えば、参照は変数の値です。これはオブジェクトを割り当てることとはまったく違います。これら2つの解釈は非常に異なる答えを持っています。 –

答えて

7

これは毎回定義し、そのループ反復のみにスコープを設定します。

ループの繰り返しが完了するとすぐに、それはGCに適格です。

Louis Wassermanがコメントしたように、変数は毎回再初期化されますが、メモリスペースはおそらく再利用されます。

+0

ありがとうございます。お気軽に – socksocket

+0

あなたはようこそ。 – kosa

+0

これはGCの対象にはなりません。スタックスロットは、ループの後に宣言された後続の変数によって再利用されるまで存在し続け、そうでない場合は、メソッドが終了するまで存続します。ループの終了ブレースに対応するJVM命令は存在しないため、JVMがスロットが使用されていないことを知る方法はありません。 – EJP

2

毎回定義されています。そのための最適化は私の知るところではありません。

1

- は毎回ループ反復参照を定義が、参考の範囲は、その反復に取り付けられています。

-あなたはがそれに内部ループをループ外の参照を宣言したが、アサインオブジェクトいる場合、参照は同じままですが、それはすべての中で、そのタイプの新しいオブジェクトを参照することを考えてみましょう繰り返し。

4

参照は各反復で定義されます。コードがネイティブコードに最適化されると、コードはループ外に移動され、パフォーマンスに影響を与える必要はありません。この参照を毎回newオブジェクトに設定すると、オブジェクトの作成が最適化されていない限り、各繰り返しで新しいオブジェクトが作成されることがあります。