Javaオブジェクトは、GC-EDそれはまだ強い参照してweaked参照してリンクされているときであります

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)

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=431969&siteId=1