jvmは、オブジェクトが参照して生きているかどうかを決定する関係を持って知っている理解し、参照の説明にJDK1.2は非常に狭い場合は、アドレスの先頭のメモリの別の部分に代わって値に格納されているデータの参照タイプは、それが主張されている参照に代わってメモリのこの作品は、JDK1.2参照の種類への参照の拡張へのJavaの概念の後に強い参照、ソフト参照、弱い参照に分かれていますダミー参照4つのタイプ
強力な参照: この参照はコードのいたるところで見つけることができます。
ソフト・リファレンス:ソフト・リファレンス・オブジェクトはソフト・リファレンス・クラスでラップされて実装され、まだ有用だが必要ではないオブジェクトを記述するために使用されます。ソフトリファレンスに関連付けられたオブジェクトは、システムがoomしようとするときにリサイクルのためにリストされます。
弱参照:弱参照オブジェクトは WeakReference クラスにラップされて実装され、必須でないオブジェクトを記述するために使用されます。弱い参照に関連づけられたオブジェクトは、ゴミコレクタが動作するときに、現在のメモリが十分かどうかに関係なく、弱い参照に関連づけられたオブジェクトをリサイクルします。
ダミー参照:弱参照オブジェクトはPhantomReferenceクラスでラップされ、オブジェクトへのダミー参照の存在はオブジェクトの寿命に全く影響しません。オブジェクトに関連付けられているダミー参照を持つ唯一の目的は、オブジェクトがコレクターによって再要求されたときに通知を受け取ることです。
テストコードを添付します。
package reference;
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
public class Test {
//参照にはどのような種類があるか?
//強い参照:newで作成されたオブジェクト。強い参照が存在する限り、ゴミコレクターはそれを再回収しない。
//SoftReference:ソフト参照はSoftReferenceを通して実装され、システムがメモリ・オーバーフローを起こそうとしている場合にのみリクレイムされる。
//WeakReference:弱い参照はWeakReferenceを介して実装され、十分なメモリがあるときに関係なくGCランタイムによって回収される。
//ダミー参照:PhantomReferenceによって実装され、ダミー参照を通じてオブジェクトのインスタンスに戻ることはできない。
//ゴミ収集のために、オブジェクトがリサイクルされるべきかどうかを判断するには?
//参照カウント・アルゴリズム:どこかに参照がある場合は常に1を加算し、参照が無効な場合は1を減算する。.カウントは0である。参照カウント・アルゴリズムの欠点は、2つのオブジェクト間の相互参照の存在を判定できないことである。
//到達可能性分析アルゴリズム:jvmは、このアプローチを使用して、出発点としてGCRootオブジェクトのシリーズを介して、これらのポイントから検索を開始するためにダウンして、検索パスは、GCへのオブジェクトは、任意の参照チェーンを持っていない場合、それはオブジェクトをリサイクルすることができることを意味する参照チェーンになる。
//上記でGCRootと述べたが、GCRootオブジェクトとは何か?
//(1)仮想マシン・スタックのスタック・フレームで参照されるオブジェクト。
//(2)メソッド領域の静的プロパティによって参照されるオブジェクト。
//(3)メソッド領域に定数参照を持つオブジェクトがある。
//(4)オブジェクトはローカル・メソッド・スタックで参照される。
public static void main(String[] args) throws InterruptedException {
// objがObjectオブジェクトを指している限り、Objectオブジェクトはリクレイムされない。
Object obj = new Object();
System.gc();
System.out.println("強く参照されるオブジェクト:"+obj);
System.out.println("---------------------------------");
// オブジェクトは、oom例外が発生するまで回収されない。
Object obje = new Object();
SoftReference<Object> softReference = new SoftReference<Object>(obje);
obje = null;
// 再要求がトリガーされたとしても、ソフト参照に関連付けられたオブジェクトは、十分なメモリがあるため、再要求されない。
System.gc();
Thread.sleep(1000);
System.out.println("ソフト参照で関連付けられたオブジェクト "+softReference.get());
System.out.println("---------------------------------");
// gcがトリガーされたときに再利用する
Object objec = new Object();
WeakReference<Object> weakReference = new WeakReference<Object>(objec);
objec = null;
// リコールがトリガーされると、弱参照オブジェクトがリコールされる。
System.gc();
System.out.println("弱い参照関連付けを持つオブジェクト:"+weakReference.get());
System.out.println("----------------------------------");
// オブジェクトが回収されたときの追跡
Object o = new Object();
// 参照キュー
ReferenceQueue queue = new ReferenceQueue();
PhantomReference p = new PhantomReference(o,queue);
o = null;
System.out.println("ダミー参照に関連付けられたオブジェクト: "+p.get());
System.gc();
Thread.sleep(1000);
System.out.println("ダミー参照:"+queue.poll());
}
}