机上ではやっと気づいたけど、詳しくやらないといけないのは分かっている --Lu You 流水源があるように運河がどのくらい澄んでいるか尋ねてください --Zhu Xi
Java はバージョン 1.2 から 4 種類の参照 とレベルを導入しましたこれら 4 つの参照は高いものから低いものへと順番に並んでいます: 強い参照>ソフト参照>弱い参照>ダミー参照。
1. 強参照:
強参照は、最も一般的に使用される参照です。通常、オブジェクトを初期化すると、それは強参照になります。 オブジェクトに強参照がある場合、JVM はそれをガベージ コレクションしません。メモリが不足している場合、強参照を再利用するのではなく、OutofMemoryError をスローしてプログラムを異常終了させます。
2. ソフトリファレンス:
オブジェクトが弱参照の場合、メモリが十分であれば、メモリ空間が不十分な場合はガベージコレクションされず、オブジェクトのこの部分はリサイクルされます。 。ガベージ コレクターがそれを再利用しない限り、プログラムはそれを使用できます。ソフト参照を使用して、メモリに依存するキャッシュを実装できます。ソフト参照は、参照キュー (ReferenceQueue) と組み合わせて使用できます。ソフト参照によって参照されるオブジェクトがガベージ コレクターによってリサイクルされる場合、Java 仮想マシンは、それに関連付けられた参照キューにソフト参照を追加します。
3. 弱参照:
弱参照とソフト参照の違いは、弱参照のライフサイクルが短いことです。ガベージ コレクターがメモリ領域をスキャンすると、弱い参照が見つかるたびにメモリ領域がリサイクルされます。ただし、ガベージ コレクターは比較的優先度の低いスレッドであるため、必ずしもこれらの弱い参照オブジェクトをすぐに見つけられるとは限りません。弱参照は参照キュー (ReferenceQueue) と組み合わせて使用できます。弱参照によって参照されるオブジェクトがガベージ コレクションされる場合、Java 仮想マシンは関連する参照キューに弱参照を追加します。
4. ファントム参照:
他の参照とは異なり、ファントム参照はオブジェクトのライフサイクルを決定しません。オブジェクトがファントム参照のみを保持している場合、オブジェクトは参照がないかのようにガベージ コレクターによっていつでも回収される可能性があります。 仮想参照は主に、ガベージ コレクターによってリサイクルされるオブジェクトのアクティビティを追跡するために使用されます。仮想参照、ソフト参照、弱参照の違いの 1 つは、仮想参照は参照キュー (ReferenceQueue) と組み合わせて使用する必要があることです。ガベージ コレクターがオブジェクトをリサイクルする準備をしているときに、オブジェクトにまだ仮想参照があることが判明すると、オブジェクトのメモリを再利用する前にその仮想参照をオブジェクトに追加します。 関連する参照キュー内。
サンプルコード:
強参照:
public class MyClass { MyClass() { } }public class Test { public static void main(String [] args) { MyClass myClass=new MyClass(); System.gc(); } }
ガベージコレクションは明示的に呼び出されますが、myClassは強参照であるため、myClassはリサイクルされません。
ソフトリファレンス:
public class MyClass { MyClass() { } }public class Test { public static void main(String [] args) { MyClass myClass=new MyClass(); SoftReference ref=new SoftReference(myClass); System.gc(); } }
ソフトリファレンスは、メモリが不足している場合に再利用されます。
弱い参照:
public class MyClass { MyClass() { } }public class Test { public static void main(String [] args) { MyClass myClass=new MyClass(); WeakReference ref=new WeakReference(myClass); System.gc(); } }
JVM ガベージ コレクション中に、弱い参照はリサイクルされます。
仮想参照:
public class MyClass { MyClass() { } }public class Test { public static void main(String [] args) { MyClass myClass=new MyClass(); ReferenceQueue rq=new ReferenceQueue(); PhantomReference pr=new PhantomReference(myClass,rq); System.gc(); } }
仮想参照はインスタンス化された後にリサイクルされます。
概要:
レベル |
いつガベージコレクションが行われますか?生き残る時間 |
強い言葉 | 決して | オブジェクトの一般的な状態
JVM の実行が停止すると終了 |
ソフト参照 | メモリ不足の場合 |
|
メモリ不足による終了 |
弱参照 | ガベージコレクションについて |
|
gc が実行後に終了しました |
|||
仮想参照 |
不明 |
不明 |
不明 |
関連記事:
JavaScriptにおける基本データ型と参照型の違いについて詳しく説明
以上がJava の 4 つの参照型の詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。