Javaの強参照、弱参照、ソフト参照、仮想参照

1. 継承構造

1.1 4大参考文献の継承関係 

Java には強参照、弱参照、ソフト参照、仮想参照の 4 つの参照タイプがあり、このうち強参照がよく使われますが、他の 3 つの参照は使用する前に特定の java.lang.ref を導入する必要があります。 . の継承構造は次のとおりです。

参照継承構造図

 一般に、強参照のみが直接使用され、他の 3 つの参照は参照キュー (ReferenceQueue) と組み合わせて使用​​する必要があります。

Javaの変数には大きく値型と参照型の2種類があり、ここでの参照型とは参照できるオブジェクトのことを指します。参照型を操作する場合、実際にはメモリ アドレスを取得するだけで、メモリ アドレスを介してオブジェクトにアクセスし、それに関連する操作を実行します。これは C++ ポインタに非常に似ていますが、まったく同じではありません。C++ には基本データ型へのポインターがありますが、Java には基本データ型への参照がなく、代わりに値型があります。

1.2 参照とポインタの関係

ここをさらに拡張して、C++ のポインターと参照と Java の参照の違いと接続について詳しく説明します。

C++ ポインター

C++ のポインタは、オブジェクトのメモリ アドレスを指します。パラメータを渡す場合、ポインタで渡す場合はオブジェクトのメモリ アドレスのみが渡されます。その後、パラメータを渡す目的を達成するために、そのアドレスが関数またはメソッド内でアクセスされます。

Javaリファレンス

Java の参照は C++ のポインタに似ていますが、まったく同じではありません。Java の参照には基本型参照がありません。参照型のみにすることができます。したがって、C++ と比較すると、int 型変数のアドレスはありません。Java は参照型のアドレスのみを取得でき、メモリ アドレスを取得することはできません。基本的なデータ型。

C++ リファレンス

C++ にも参照がありますが、C++ 参照はポインタや Java 参照とは異なり、変数またはオブジェクトのエイリアスであり、コピーとは異なり、元のデータを直接操作します。

2. 4つの主要な引用方法

2.1 強参照(リファレンス)

強参照を使用するためにパッケージを導入する必要はなく、Java のデフォルトの参照方法は強参照です。

一般的に使用する参照は強参照です。メモリが不足すると、JVM はガベージ収集を開始します。ただし、JVM は強参照を持つオブジェクトをリサイクルしません。OOM (OutOfMemory) が発生しても、JVM はそれらをリサイクルしません。つまり、強参照を持つオブジェクトは JVM によってリサイクルされません。これにより、プログラムの実行中に一部のリソースがリサイクルされなくなります。もちろん、長所と短所があります。一部のリソースが大きすぎると、大量のメモリを占有します。OOM が発生した場合でも、JVM はリサイクルしませんそれらはプログラムの問題を引き起こす可能性があります。場合によっては、これによりプログラムでメモリ リークが発生する可能性があります。

2.2 ソフトリファレンス

ソフト参照を使用するには、java.lang.ref.SoftReference を導入する必要があります。

ソフト参照は強参照ほど絶対的ではないため、メモリが不足すると、JVM はガベージを収集しようとし、その際にソフト参照を持つオブジェクトがリサイクルされます。ただし、メモリが不足しない場合、JVM はソフト参照オブジェクトを再利用しません。このソフトリファレンスの機能は非常に優れており、Java の自動メモリ管理の標準機能とも言えます。Java が自動的にメモリを管理できることはわかっていますが、プログラムの実行中、JVM は特定のメモリ空間を自動的に決定できません。空間のこの部分が強参照オブジェクトでいっぱいで、大量のメモリを占有している場合、原因 OOM が発生した場合は、プログラムに問題があります。このとき、プログラマはそれをソフト参照として設定し、メモリが不足した場合にこのオブジェクトを解放できることを JVM に伝える必要があります。ソフト参照は、画像リソースや Web ページ リソースのキャッシュで広く使用されています。

2.3 弱参照

弱参照を使用するには、java.lang.ref.WeakReference を導入する必要があります。

弱参照は、ソフト参照よりも「弱い」参照方法です。Java のガベージ コレクション メカニズムが実行を開始すると、十分なメモリがあるかどうかに関係なく、弱参照オブジェクトはすぐにリサイクルされます。弱参照は通常、あまり使用されません。

2.4 ファントムリファレンス

仮想参照を使用するには、java.lang.ref.PhantomReference を導入する必要があります。

仮想参照はその名のとおり、実際の参照ではなく仮想的な参照であるため、このオブジェクトには参照がないと考えられ、仮想参照を介してこのオブジェクトにアクセスすることはできません。仮想参照オブジェクトはいつでもリサイクルできます。仮想参照は、オブジェクトをマークするものとして理解できます。プログラマは、これにより、オブジェクトがリサイクルされるか、リサイクルされたかを知ることができます。仮想参照の存在は、オブジェクトがかつて存在したことを象徴するだけです。

3. まとめ

上記 4 つの引用方法を次の表にまとめます。

参考方法 メモリが足りないとき ガベージコレクションの開始時 残りのケース
強力な参照 いいえ いいえ いいえ
ソフトリファレンス はい いいえ いいえ
弱引用 はい はい いいえ
仮想参照 可能 可能 可能

一般的なプログラムでは、弱参照や仮想参照はほとんど使用されませんが、強参照は日常的に使用されますが、場合によっては(リソースファイルが大きいが、同時にすべてを使用する必要がない場合など)当然のことながら、ソフト参照を使用して、元の強参照を置き換えます。まず、特定の状況で生成される OOM を回避できます。さらに、プログラムで使用されるメモリを削減し、プログラムの実行速度を向上させることができます。

おすすめ

転載: blog.csdn.net/weixin_62651706/article/details/132273843