1. はじめに
以前に、JVMのガベージコレクションのメカニズムについて学びました。ガベージコレクションはJVMの自己解放動作であることはわかっていますが、System.gc()またはRuntime.getRuntime()を介して明示的にガベージコレクションを呼び出すことができます。Gc()、JVMは明示的なガベージコレクションの呼び出しはマスクされ、JVMにも独自のガベージコレクションメカニズムのセットがあるため、JVMを「伝える」ことができる方法、どのオブジェクトを後で収集するために使用できるか、どのオブジェクトを保持するかはありますか?ここでは、JAVAオブジェクトの参照型について説明する必要があります。
次に、オブジェクト参照の簡単な紹介
- 強参照:メモリが十分であるかどうかに関係なく、メモリはリサイクルされません。
- ソフト参照:メモリが不十分な場合、参照に関連付けられたオブジェクトがリサイクルされます。
- 弱い参照:ガベージコレクション中は、メモリが十分かどうかに関係なく、再利用されます。
- 仮想参照:ガベージコレクタによっていつでもリサイクルできます。
Javaでこれらの4つの参照型を提供する主な目的は2つあります。
-
- 1.プログラマーに、コードを通じて特定のオブジェクトのライフサイクルを決定させます。
- 2. 2番目は、JVMガベージコレクションに役立ちます。
3、オブジェクト参照コードの例
強い参照
強い参照は、最も広く使用されている最も一般的なタイプの参照です。一般的な参照は、オブジェクトの作成に使用されます。
// 1.強い参照の例 String str = new String();
特徴:
- オブジェクトが強く参照されているか、オブジェクトに強い参照が関連付けられている限り、JVMは確実にオブジェクトをリサイクルしません
- メモリが不足している場合、JVMは OutOfMemoryエラーをスローします
- リサイクルする必要がある場合、このオブジェクトを明示的にnullに設定できます。JVMは、ガベージコレクションの発生時にこのオブジェクトを自動的にリサイクルします。
ソフトリファレンス
ソフト参照は、java.lang.refのを使用してJavaでいくつかの有用なではなく、本来の目的を記述するために使用されている。SoftReferenceのクラス表現するために。ソフト参照に関連付けられているオブジェクトの場合、JVMはメモリが不足している場合にのみオブジェクトを再利用します。
// 2.ソフトリファレンスの例 SoftReference <String> softStr = new SoftReference <String>(new String( "これはソフトリファレンスタイプの文字列オブジェクトです" )); System.out.println(softStr.get());
強参照に比べて、ソフト参照はOOM [Out Of Memory]の問題をよりよく解決します。ソフト参照を使用すると、いくつかの有用なデータを設定できますが、コアコンテンツは設定できません。空き容量を取り戻すことができます。画像オブジェクトなどのソフトリファレンスなどの一般的なアプリケーション
特徴:
- SoftReferenceクラスパッケージリファレンス
- JVM メモリが不足している場合はリサイクルされます [強い参照の関連付けがある場合はリサイクルしないでください]
弱い参照
弱参照は、java.lang.refの。使用してJavaで有用であるが、必須ではないオブジェクトの数を記述するために使用されている弱い参照を表すためにクラスを。弱参照に関連付けられているオブジェクトの場合、JVMがガベージコレクションを実行すると、メモリが十分かどうかに関係なく、JVMはリサイクルされます。
// 3.弱参照の例 WeakReference <String> weekStr = new WeakReference <String>(new String( "これは弱参照型の文字列オブジェクトです" )); System.out.println(weekStr.get()); // JVMガベージコレクションを明示的に呼び出す System.gc(); // 弱参照の内容を出力する[ガベージコレクションを明示的に呼び出すと弱参照オブジェクトの内容がリサイクルされるため、この時点でnullが出力されます] システム。 out.println(weekStr.get());
PS:弱い参照オブジェクトに対応する強い参照の関連付けがある場合、この弱い参照はガベージコレクション中に収集されません[ソフト参照も同様です]
特徴:
- WeakReferenceクラスパッケージリファレンス
- JVM メモリが十分かどうか、全てゴミになりますリサイクル [強参照に関連付けられた回復時間がありません]
仮想参照
仮想参照はオブジェクトのライフサイクルに影響を与えません。java.lang.refの持つJavaではPhantomReferenceのクラスが表しています。オブジェクトが仮想参照に関連付けられている場合は、関連付けられている参照がないかのように、ガベージコレクターによっていつでも収集される可能性があります。
// 4.仮想参照の例 // 4.1。参照キューを作成する[仮想参照は参照キューに関連付ける必要がある] ReferenceQueue <String> queue = new ReferenceQueue <String> (); // 4.2。文字でラップされた仮想参照を作成する文字列オブジェクトの参照アドレス PhantomReference <String> phantomStr = new PhantomReference <String>(new String( "This is a string object of virtual reference type" )、queue); // 4.3、参照コンテンツの出力[結果がnullであることが判明】 System.out.println(phantomStr.get());
特徴:
- PhantomReferenceクラスパッケージリファレンス
- ガベージコレクターでいつでもリサイクルできます。
- 参照キューと組み合わせて使用する必要があります
参照キュー(ReferenceQueue)
役割:
- Referenceが指すオブジェクトがガベージコレクションされたかどうかを監視するために使用されます。
使用シナリオ:
- 多くの参照がインスタンスオブジェクトのラップに使用されている場合、参照が指すオブジェクトはリサイクルされる可能性がありますが、参照自体もオブジェクトであるため、それもリサイクルされる必要があり、その後、ReferenceQueueを使用する必要があります。
リサイクルモードの違い:
- 場合SoftReference又は弱い参照場合GET()またはオブジェクトが単にガベージコレクションプロセスに示されていることを示している添加ReferenceQueueのget()戻り値のnullは、この時点で必ずしもガーベッジオブジェクトである必要はありませんました。
- 場合PhantomReferenceは、 ReferenceQueueを添加した場合、それがことを示している物体のニーズがリサイクルし持っする[ PS:だからステップ4.3仮想基準の一例を、ヌルコールgetメソッドを返します]。