2017-09-27 10 views
2

WeakReferenceの使用と強力なref型の設定の違いは何ですか?弱参照とNULLの設定

たとえば、次のコードでは、変数 "test"は "testString"に対する強い参照です。 "test"をnullに設定したとき。 Strong refはなくなり、 "testString"はGCに適格になりました。だから単純にオブジェクト参照 "test"をnullに等しく設定できるのであれば、WeakReference Typeを持つ点は何ですか?

class CacheTest { 
    private String test = "testString"; 

    public void evictCache(){ 
    test = null; // there is no longer a Strong reference to "testString" 
    System.gc(); //suggestion to JVM to trigger GC 
    } 
} 

なぜWeakReferenceを使用したいですか?

class CacheTest { 
    private String test = "testString"; 
    private WeakReference<String> cache = new WeakReference<String>(test); 

    public void evictCache(){ 
    test = null; // there is no longer a Strong reference to "testString" 
    System.gc(); //suggestion to JVM to trigger GC 
    } 
} 
+0

は、あなたが参照質問の範囲は非常にボード、ここに私は非常に明示的に求めていますされて同意できません質問と例 –

+0

@ ShivamSinha二重回答と文書はこれを詳細にカバーしています。参照を無効にするだけで気にしないときは、弱い参照は必要ありません。より弱い参照のセットのポイントは、あなたがそれを行う必要がなく、GCがあなたにそれを処理させることです。それは「GCのポイントは何ですか?私はもはや必要がなくなったら解放してもいい」と考えてください。 – pvg

+2

この単純なシナリオではWeakReferenceは過剰です。リソースが他の多くのオブジェクト間で共有されるような大きなアプリケーションを使用している場合は、そのリソースについての依然として強い参照を持つ人がより曖昧になります。ここでは、通常、リソースへの唯一の強力な参照を保持し、クライアントへの弱い参照を渡すだけの一種のレジストリという中心点があります。そうすれば、リソースマネージャ/レジストリが他のオブジェクトを削除している場合に、リソースがGCに適格になることが保証されます。他のオブジェクトでも、リスト、マップなどに強い参照が残っている可能性があります。 –

答えて

2

この例では、2つのケースで違いはありません。違いがある場合しかし、あなたに似た次の例を考えてみます。

class CacheTest { 
    private String test = "testString"; 
    private String another = "testString"; 

    public void evictCache(){ 
    test = null; // this still doesn't remove "testString" from the string pool because there is another strong reference (another) to it. 
    System.gc(); //suggestion to JVM to trigger GC 
    } 
} 

class CacheTest { 
    private String test = "testString"; 
    private WeakReference<String> cache = new WeakReference<String>(test); 

    public void evictCache(){ 
    test = null; // this removes "testString" from the pool because there is no strong reference; there is a weak reference only. 
    System.gc(); //suggestion to JVM to trigger GC 
    } 
}