zhuj9:
ここで私は例があります。
import java.lang.ref.WeakReference;
public class WeakRefTest {
public static void main(String[] args) {
Object obj = new Object();
WeakReference<Object> weakRef = new WeakReference<Object>(obj);
int i = 0;
while (true) {
if (weakRef.get() != null) {
i++;
System.out.println("The object is alive for " + i + " loops - " + weakRef);
} else {
System.out.println("The object has been collected.");
break;
}
}
}
}
このプログラムを実行しているとき、私たちはして出力を得ることができます"The object has been collected."
オブジェクトはGC-EDなることを意味しながら、後に。
しかし、名前の強い参照依然として存在している"obj"
オブジェクトにリンクされているが、それを再利用することができますか、?JVMが見つかったので、それは強い到達可能だではないので、何の強い参照の使用量は、後にありませんか?
Nicktar:
あなたのループがリソース使用量の面で非常に「熱い」実行されているので、JVMは、それを最適化することになるでしょう。そうすることで、実際に強い参照がループを入力した後に到達したので、すぐにそれを最適化することができないという事実に、コンパイラを指している可能性があります。
あなたのような何かを追加する場合に、この現象は、おそらく変更されますSystem.out.println(obj)
あなたのループの後に。コンパイラは新しい文が実際到達不能コードであることを見ることができないように、あなたは...あなたのループ条件を微調整する(のようなものが必要になる場合がありますwhile (weakRef.get() != null)
)