ホームページ  >  記事  >  バックエンド開発  >  Java オブジェクトの強い参照、弱い参照、弱い参照、および仮想参照

Java オブジェクトの強い参照、弱い参照、弱い参照、および仮想参照

黄舟
黄舟オリジナル
2016-12-20 13:34:101667ブラウズ

JDK1.2 より前のバージョンでは、オブジェクトがどの変数からも参照されていない場合、プログラムはそのオブジェクトを使用できなくなります。つまり、プログラムは、オブジェクトが到達可能な場合にのみオブジェクトを使用できます。これは日常生活と同じで、お店で物を買った後、役に立つものであればそのまま持ち、そうでないものはゴミ箱に捨てて清掃業者に回収してもらいます。一般的に、一度ゴミ箱に捨てられたアイテムを拾って再度使用することはできません。

しかし、状況はそれほど単純ではない場合もあり、味気なく、捨てるのは残念です。この種のアイテムは今は役に立ちませんが、保管しておくとスペースがかかりますが、将来使用される可能性があるため、すぐに捨てるのは費用対効果が高くありません。このような必需品については、家に十分なスペースがある場合は、まず自宅に置いておくという妥協案が考えられます。自宅に十分なスペースがない場合は、家のゴミをすべて撤去したとしても、必要不可欠なアイテムを収納することはできません。日用品が足りない場合は、これらの必需品を捨ててください。

JDK バージョン 1.2 以降、オブジェクト参照は 4 つのレベルに分割され、プログラムがオブジェクトのライフサイクルをより柔軟に制御できるようになりました。これら 4 つのレベルは、高から低の順に、強参照、ソフト参照、弱参照、仮想参照です。


1.強い引用

この章の前半で紹介した引用は、実際には強い引用であり、最もよく使用される引用です。オブジェクトに強い参照がある場合、それは必須の日用品と同様であり、ガベージ コレクターはそれを再利用することはありません。メモリ領域が不十分な場合、Java 仮想マシンは、メモリ不足の問題を解決するために強参照を持つオブジェクトを恣意的にリサイクルするのではなく、OutOfMemoryError エラーをスローしてプログラムを異常終了させます。

2.ソフト参照



オブジェクトがソフト参照のみを持つ場合、それは使い捨ての日用品に似ています。十分なメモリ領域がある場合、ガベージ コレクタはメモリ領域を再利用しません。メモリ領域が不十分な場合は、これらのオブジェクトのメモリが再利用されます。ガベージ コレクターがオブジェクトを収集しない限り、オブジェクトはプログラムで使用できます。ソフト参照を使用して、メモリに依存するキャッシュを実装できます。

ソフト参照は、参照キュー (ReferenceQueue) と組み合わせて使用​​できます。ソフト参照によって参照されるオブジェクトがガベージ コレクションされた場合、Java 仮想マシンは、それに関連付けられた参照キューにソフト参照を追加します。



3.弱参照

オブジェクトが弱参照しか持たない場合、それは使い捨ての日用品に似ています。弱参照とソフト参照の違いは、弱参照のみを持つオブジェクトのライフサイクルが短いことです。ガベージコレクタスレッドが管轄するメモリ領域をスキャンする過程で、弱参照のみを持つオブジェクトが見つかると、現在のメモリ空間が十分であるかどうかに関係なく、そのオブジェクトのメモリが再利用されます。ただし、ガベージ コレクターは優先度が非常に低いスレッドであるため、弱い参照のみを持つオブジェクトを必ずしもすぐに見つけられるとは限りません。

弱参照は参照キュー (ReferenceQueue) と組み合わせて使用​​できます。弱参照によって参照されるオブジェクトがガベージ コレクションされた場合、Java 仮想マシンはそれに関連付けられた参照キューに弱参照を追加します。

4.ファントム参照

名前が示すように、「ファントム参照」は名前だけです。他の参照とは異なり、ファントム参照はオブジェクトのライフサイクルを決定しません。オブジェクトがファントム参照のみを保持している場合、オブジェクトには参照がないかのようになり、いつでもガベージ コレクションが行われる可能性があります。
仮想参照は主に、ガベージ コレクションされるオブジェクトのアクティビティを追跡するために使用されます。仮想参照、ソフト参照、弱参照の違いの 1 つは、仮想参照は参照キュー (ReferenceQueue) と組み合わせて使用​​する必要があることです。ガベージ コレクターがオブジェクトをリサイクルする準備をしているときに、オブジェクトにまだ仮想参照があることが判明すると、オブジェクトのメモリをリサイクルする前に、それに関連付けられた参照キューに仮想参照を追加します。プログラムは、仮想参照が参照キューに追加されているかどうかを判断することによって、参照されたオブジェクトがガベージ コレクションされるかどうかを判断できます。プログラムは、仮想参照が参照キューに追加されたことを検出すると、参照されたオブジェクトのメモリがリサイクルされる前に必要なアクションを実行できます。

本書では、「引用」は動詞としても名詞としても使用できますが、読者は文脈に応じて「引用」の意味を区別してください。

java.lang.ref パッケージには、SoftReference クラス、WeakReference クラス、PhantomReference クラスの 3 つのクラスが提供されており、それぞれソフト参照、弱参照、ファントム参照を表します。 ReferenceQueue クラスは参照キューを表し、これら 3 つの参照クラスと組み合わせて使用​​して、参照されたオブジェクトをリサイクルする際の Java 仮想マシンのアクティビティを追跡できます。次のプログラムは、String オブジェクト、ReferenceQueue オブジェクト、および WeakReference オブジェクトを作成します:

//強参照を作成します
String str = new String("hello");

//参照キューを作成します。 は String オブジェクトへの参照がキューに格納されていることを示します
ReferenceQueue();

//Create 「hello」オブジェクトを参照し、rq 参照キューに関連付けられている弱参照
// は、WeakReference が String オブジェクトを弱参照することを示す一般的なマークです
WeakReference wf = new WeakReference< String>(str, rq);

上記は、Java オブジェクトの強参照、ソフト参照、弱参照、および仮想参照の内容です。さらに関連した内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。