JDK1.2 より前のバージョンでは、オブジェクトがどの変数からも参照されていない場合、プログラムはそのオブジェクトを使用できなくなります。つまり、プログラムは、オブジェクトが到達可能な場合にのみオブジェクトを使用できます。これは日常生活と同じで、お店で物を買った後、役に立つものであればそのまま持ち、そうでないものはゴミ箱に捨てて清掃業者に回収してもらいます。一般的に、一度ゴミ箱に捨てられたアイテムを拾って再度使用することはできません。
しかし、状況はそれほど単純ではない場合もあり、味気なく、捨てるのは残念です。この種のアイテムは今は役に立ちませんが、保管しておくとスペースがかかりますが、将来使用される可能性があるため、すぐに捨てるのは費用対効果が高くありません。このような必需品については、家に十分なスペースがある場合は、まず自宅に置いておくという妥協案が考えられます。自宅に十分なスペースがない場合は、家のゴミをすべて撤去したとしても、必要不可欠なアイテムを収納することはできません。日用品が足りない場合は、これらの必需品を捨ててください。
JDK バージョン 1.2 以降、オブジェクト参照は 4 つのレベルに分割され、プログラムがオブジェクトのライフサイクルをより柔軟に制御できるようになりました。これら 4 つのレベルは、高から低の順に、強参照、ソフト参照、弱参照、仮想参照です。
この章の前半で紹介した引用は、実際には強い引用であり、最もよく使用される引用です。オブジェクトに強い参照がある場合、それは必須の日用品と同様であり、ガベージ コレクターはそれを再利用することはありません。メモリ領域が不十分な場合、Java 仮想マシンは、メモリ不足の問題を解決するために強参照を持つオブジェクトを恣意的にリサイクルするのではなく、OutOfMemoryError エラーをスローしてプログラムを異常終了させます。
オブジェクトがソフト参照のみを持つ場合、それは使い捨ての日用品に似ています。十分なメモリ領域がある場合、ガベージ コレクタはメモリ領域を再利用しません。メモリ領域が不十分な場合は、これらのオブジェクトのメモリが再利用されます。ガベージ コレクターがオブジェクトを収集しない限り、オブジェクトはプログラムで使用できます。ソフト参照を使用して、メモリに依存するキャッシュを実装できます。
3.弱参照
弱参照は参照キュー (ReferenceQueue) と組み合わせて使用できます。弱参照によって参照されるオブジェクトがガベージ コレクションされた場合、Java 仮想マシンはそれに関連付けられた参照キューに弱参照を追加します。
名前が示すように、「ファントム参照」は名前だけです。他の参照とは異なり、ファントム参照はオブジェクトのライフサイクルを決定しません。オブジェクトがファントム参照のみを保持している場合、オブジェクトには参照がないかのようになり、いつでもガベージ コレクションが行われる可能性があります。
仮想参照は主に、ガベージ コレクションされるオブジェクトのアクティビティを追跡するために使用されます。仮想参照、ソフト参照、弱参照の違いの 1 つは、仮想参照は参照キュー (ReferenceQueue) と組み合わせて使用する必要があることです。ガベージ コレクターがオブジェクトをリサイクルする準備をしているときに、オブジェクトにまだ仮想参照があることが判明すると、オブジェクトのメモリをリサイクルする前に、それに関連付けられた参照キューに仮想参照を追加します。プログラムは、仮想参照が参照キューに追加されているかどうかを判断することによって、参照されたオブジェクトがガベージ コレクションされるかどうかを判断できます。プログラムは、仮想参照が参照キューに追加されたことを検出すると、参照されたオブジェクトのメモリがリサイクルされる前に必要なアクションを実行できます。
java.lang.ref パッケージには、SoftReference クラス、WeakReference クラス、PhantomReference クラスの 3 つのクラスが提供されており、それぞれソフト参照、弱参照、ファントム参照を表します。 ReferenceQueue クラスは参照キューを表し、これら 3 つの参照クラスと組み合わせて使用して、参照されたオブジェクトをリサイクルする際の Java 仮想マシンのアクティビティを追跡できます。次のプログラムは、String オブジェクト、ReferenceQueue オブジェクト、および WeakReference オブジェクトを作成します:
//強参照を作成します
String str = new String("hello");
//参照キューを作成します。
ReferenceQueue
//Create 「hello」オブジェクトを参照し、rq 参照キューに関連付けられている弱参照
//
WeakReference
上記は、Java オブジェクトの強参照、ソフト参照、弱参照、および仮想参照の内容です。さらに関連した内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。