Weak Reference Soft Reference Phantom Reference

3448 ワード

JAVAでの引用
JAVAには4種類の引用が存在し,強から弱の順に強引用,ソフト引用,弱引用,虚引用である.
  • 強参照(Strong Reference):通常、newでオブジェクトを作成するときに返される参照は強参照です.オブジェクトが一連の強い参照によって達成される場合、このオブジェクトは強力に達成され、ゴミ回収されません.
  • ソフトリファレンス(Soft Reference):ソフトリファレンスと弱リファレンスの違いは、1つのオブジェクトが弱リファレンスでしか達成できない場合、メモリが十分であるかどうかにかかわらず、そのオブジェクトが回収されることです.ただし、オブジェクトがソフトリファレンスでのみ使用できる場合、オブジェクトはメモリが不足している場合にのみ回収されます.したがって、ソフトリファレンスは弱いリファレンスよりも強いです.ソフトリファレンスは、メモリに敏感なキャッシュを実現するために使用できます.

  • ソフトリファレンスは、ブラウザの後退ボタンなど、実際に重要なアプリケーションがあります.後退を押すと、この後退ボタンに対応するページの内容が再要求されるのか、キャッシュから取り出されるのか.これは具体的な実現戦略にかかっている.
  • 閲覧終了時に1つのページがコンテンツの回収を行う場合、前に閲覧したページを戻るように表示する場合は、再構築を要求する必要があります.
  • ブラウズしたWebページをメモリに保存すると、メモリが大量に浪費され、メモリがオーバーフローする可能性があります.この場合、ソフトリファレンスを使用できます.
  • Page prev = new Page(); //         
    SoftReference softRef = new SoftReference(prev); //          
    if (softRef.get() != null) {
       prev = softRef.get(); //            ,    。
    } else {
       prev = new Page(); //       ,      ,    。
       softRef = new SoftReference(prev); //        
    }
    
  • 弱参照(Weak Reference):弱参照オブジェクトの存在は、そのオブジェクトがゴミ回収されることを阻止しません.ゴミ収集器が、ある時点でオブジェクトが弱可達(weakly reachable)であることを決定すると(すなわち、現在指向されているすべてが弱参照である)、ゴミ収集器は、そのオブジェクトを指すすべての弱参照を消去し、そのオブジェクトを終端可能(finalizable)とマークし、その後回収される.同時にまたは後で、ゴミ収集器は、消去されたばかりの弱い参照を参照キュー(Reference Queue、弱い参照オブジェクトの作成時に指定)に入れます.
  • 虚引用(Phantom Reference):虚引用はJAVAで最も弱い引用ですが、どの程度弱いですか.これは、仮想参照によって参照されたオブジェクトを取得することさえできないほど弱く、仮想参照が存在する唯一の役割は、その指向するオブジェクトが回収されると、仮想参照自体が参照キューに追加され、その指向するオブジェクトが回収されたことを記録するために使用されることです.ダミーリファレンスとソフトリファレンスと弱リファレンスの違いは、ダミーリファレンスがリファレンスキュー(ReferenceQueue)と組み合わせて使用される必要があることです.ゴミ回収器がオブジェクトを回収する準備をしている場合、ダミーリファレンスがあることが判明すると、オブジェクトのメモリを回収する前に、このダミーリファレンスを関連するリファレンスキューに追加します.ダミーリファレンスは、主にオブジェクトがゴミ回収された状態を追跡するために使用され、リファレンスキューにオブジェクトが含まれているかどうかを確認することによって、オブジェクトがゴミ回収されるかどうかを判断し、ターゲットオブジェクトを取得するために行動することは期待されません.Cleanerは虚参照の例です.

  • リファレンスキュー
    実際、WeakReferenceには2つのコンストラクション関数があります.
  • WeakReference(T referent)
  • WeakReference(T referent, ReferenceQueue super T> q)

  • 2つ目の構成方法では、ReferenceQueueタイプのパラメータが提供されていることがわかります.このパラメータを提供することで、作成した弱い参照オブジェクトをこの参照キューに登録し、弱い参照オブジェクトがゴミ回収器で回収されると、参照キューに挿入されます.これらの消去された弱い参照オブジェクトを統一的に管理できます(一般的にはリソース消去作業を行います).
    WeakHashMap
    WeakHashMap内部は弱引用によってentryを管理していますが、弱引用の特性がWeakHashMapに対応することは何を意味しますか?ペアをWeakHashMapに入れることは、WeakHashMap以外にキーへの強い参照がない限り、キー値がGCで回収されることを避けることはできません.
    WeakHashMapのポイントは次のとおりです.
  • WeakHashMapでは、キー内のオブジェクトが正常に使用されなくなると、エントリが自動的に削除されます.より正確には、所与のキーについて、そのマッピングの存在は、ゴミ回収器によるキーの廃棄を阻止するものではなく、これにより、キーが終了可能となり、終了し、回収される.キーを破棄すると、そのエントリはマッピングから効果的に除去されます.
  • WeakHashMapクラスの動作部分はゴミ回収機の動作に依存する.ごみ捨てはいつでもキーを捨てることができるので、WeakHashMapはエントリをこっそり削除した未知のスレッドのようです.特に、WeakHashMapインスタンスが同期されていて、付与メソッドが呼び出されていない場合でも、sizeメソッドは一定時間後に小さい値を返すことができ、isEmptyメソッドではfalseを先に返し、trueを返すことができ、containsKeyメソッドではtrueを先に返し、falseを返すことができ、与えられたキーに対して、getメソッドは、まず値を返すことができますが、nullを返します.以前にマッピングに現れたキーに対してputメソッドはnullを返します.removeメソッドはfalseを返します.キーセット、値セット、エントリセットのチェックでは、生成される要素の数はますます少なくなります.
  • WeakHashMapの各キーオブジェクトは、弱い参照の指示オブジェクトとして間接的に格納される.したがって、マッピング内でもマッピング外でも、ゴミ回収器がキーの弱い参照をクリアした後にのみ、キーが自動的に削除されます.
  • は、同時セキュリティバージョンのWeakHashMapを使用する場合はCollections.synchronizedMap(weakHashMap)を使用して同期すれば、ほとんどの集合クラスと同様です.

  • 適用シーン:WeekHashMapのこの特徴は、キャッシュが必要なシーンに特に適しています.キャッシュシーンでは、メモリが限られているため、すべてのオブジェクトをキャッシュできません.オブジェクトキャッシュヒットはシステム効率を向上させることができますが、キャッシュMISSは計算によって再取得できるため、エラーは発生しません.