Javaベース:Javaの4つの参照
2947 ワード
Javaベース:java仮想マシン(JVM)では、Javaの4つの参照について説明します.含む:強参照、ソフト参照、弱参照、虚参照.このブログでは、この4つの引用を詳しく説明します. 1.強引用 .ソフトリファレンス 3.弱引用 4.ダミー参照 5.参照文書 1.強引用
デフォルトの
2.ソフトリファレンス
オブジェクトがソフトリファレンスのみの場合、十分なメモリがある場合、GCはそれを回収しません.メモリが不足している場合、GCはそれを回収します.この場合、sf.get()メソッドでこのオブジェクトを取得する必要があります.もちろん、このオブジェクトが回収するオブジェクトとしてマークされている場合はnullを返します.
ソフトリファレンスの主なユーザーはキャッシュのような機能を実現し、メモリが十分な場合に直接ソフトリファレンスを通じて値を取り、忙しい実際のソースからデータを検索する必要がなく、速度を向上させる.メモリが不足している場合は、このキャッシュデータを自動的に削除し、実際のソースからデータをクエリーします.
通常、ソフトリファレンスは1つのリファレンスキューと共同で使用できます.すなわち,ソフトリファレンスのオブジェクトがGCで回収されると,JVMはこのソフトリファレンスをそれに関連付けられたキューに入れる.ソフトリファレンスの例は次のとおりです.
実行結果は次のとおりです.
3.弱引用
弱いリファレンスはソフトリファレンスよりも短いライフサイクルで、GCが弱いリファレンスのみを持つオブジェクトを発見すると、現在のメモリが不足しているかどうかにかかわらず回収されます.GCは優先度(優先度の内容はJavaマルチスレッド:ライフサイクル、実装とスケジューリングの3.4節:スレッドの優先度)の低いスレッドであり、弱い参照のみを持つオブジェクトをすぐに発見するとは限らない.弱いリファレンスの使用方法はソフトリファレンスと似ています.
実行結果は以下の通りであり,GCはすぐには実行されないことが分かる.
弱いリファレンスは、主に、オブジェクトが回収されるゴミとしてマークされているかどうかを監視するために使用されます.ソフトリファレンスと同様に、弱いリファレンスもリファレンスキューと共同で使用できます.
4.虚参照
虚引用は幽霊引用とも呼ばれ、オブジェクトのライフサイクルは決定されません.1つのオブジェクトに1つのダミーリファレンスしか存在しない場合は、リファレンスがないのと同じであり、いつでもGCによって回収される可能性があります.ダミーリファレンスは主にGCのアクティビティを追跡するために使用されます.ダミーリファレンスはリファレンスキューと連携して使用する必要があります.GCはオブジェクトを回収する際にダミーリファレンスが見つかった場合、まずダミーリファレンスをリファレンスキューに配置します.
実行結果は以下の通りであり,虚参照は直ちにGCによって回収され,参照がないことに相当する.
5.参考文書
Javaの4つの参照には、強参照、ソフト参照、弱参照、虚参照が含まれます.
デフォルトの
Object object=new Object()
の形式では、objectはオブジェクトnew Object()の強い参照であり、objectという参照が解放された後にのみオブジェクトが解放されます.これも私たちが最もよく使う符号化方法です.1つのリファレンスが強いリファレンスであれば、メモリが不足していてもGCは絶対にそれを回収せず、むしろOutOfMemoryErrorエラーを投げ出すことができます.2.ソフトリファレンス
オブジェクトがソフトリファレンスのみの場合、十分なメモリがある場合、GCはそれを回収しません.メモリが不足している場合、GCはそれを回収します.この場合、sf.get()メソッドでこのオブジェクトを取得する必要があります.もちろん、このオブジェクトが回収するオブジェクトとしてマークされている場合はnullを返します.
ソフトリファレンスの主なユーザーはキャッシュのような機能を実現し、メモリが十分な場合に直接ソフトリファレンスを通じて値を取り、忙しい実際のソースからデータを検索する必要がなく、速度を向上させる.メモリが不足している場合は、このキャッシュデータを自動的に削除し、実際のソースからデータをクエリーします.
通常、ソフトリファレンスは1つのリファレンスキューと共同で使用できます.すなわち,ソフトリファレンスのオブジェクトがGCで回収されると,JVMはこのソフトリファレンスをそれに関連付けられたキューに入れる.ソフトリファレンスの例は次のとおりです.
ReferenceQueue referenceQueue=new ReferenceQueue();
SoftReference softReference=new SoftReference(new Integer(3),referenceQueue);
System.out.println("softReference.get(): "+softReference.get());// ,
System.out.println("softReference.isEnqueued(): "+softReference.isEnqueued());//
実行結果は次のとおりです.
softReference.get(): 3
softReference.isEnqueued(): false
3.弱引用
弱いリファレンスはソフトリファレンスよりも短いライフサイクルで、GCが弱いリファレンスのみを持つオブジェクトを発見すると、現在のメモリが不足しているかどうかにかかわらず回収されます.GCは優先度(優先度の内容はJavaマルチスレッド:ライフサイクル、実装とスケジューリングの3.4節:スレッドの優先度)の低いスレッドであり、弱い参照のみを持つオブジェクトをすぐに発見するとは限らない.弱いリファレンスの使用方法はソフトリファレンスと似ています.
WeakReference weakReference=new WeakReference(new Integer(4),referenceQueue);
System.out.println("weakReference.get(): "+weakReference.get());// ,
System.out.println("weakReference.isEnqueued(): "+weakReference.isEnqueued());//
実行結果は以下の通りであり,GCはすぐには実行されないことが分かる.
weakReference.get(): 4
weakReference.isEnqueued(): false
弱いリファレンスは、主に、オブジェクトが回収されるゴミとしてマークされているかどうかを監視するために使用されます.ソフトリファレンスと同様に、弱いリファレンスもリファレンスキューと共同で使用できます.
4.虚参照
虚引用は幽霊引用とも呼ばれ、オブジェクトのライフサイクルは決定されません.1つのオブジェクトに1つのダミーリファレンスしか存在しない場合は、リファレンスがないのと同じであり、いつでもGCによって回収される可能性があります.ダミーリファレンスは主にGCのアクティビティを追跡するために使用されます.ダミーリファレンスはリファレンスキューと連携して使用する必要があります.GCはオブジェクトを回収する際にダミーリファレンスが見つかった場合、まずダミーリファレンスをリファレンスキューに配置します.
PhantomReference phantomReference = new PhantomReference (new Integer(5), referenceQueue);
System.out.println("phantomReference.get(): "+phantomReference.get());// ,
System.out.println("phantomReference.isEnqueued(): "+phantomReference.isEnqueued());//
実行結果は以下の通りであり,虚参照は直ちにGCによって回収され,参照がないことに相当する.
phantomReference.get(): null
phantomReference.isEnqueued(): false
5.参考文書
Javaの4つの参照には、強参照、ソフト参照、弱参照、虚参照が含まれます.