ソフトリファレンス弱リファレンス虚リファレンスコードテスト分析
3602 ワード
コードは次のとおりです.
実行結果:
begin
user SoftReference hase been GC : false
user SoftReference hase been GC : false
user SoftReference hase been GC : false
1 :false
HELLO WORLD
2 :false
user WeakReference hase been GC : false
user WeakReference hase been GC : false
3 :false
user WeakReference hase been GC : false
4 :true
5 :true
user PhantomReference hase been GC : false
user PhantomReference hase been GC : false
user PhantomReference hase been GC : true
ソフトリファレンス分析:
一般的にキャッシュに使用され、JVMメモリが不足している場合にのみGCされるため、user=nullとなり、その後もGCされません.JVMのヒープメモリを小さく設定するだけで、GC効果を設定する可能性があります.また、GCは、スキャンしたSoftReferenceが頻繁に使用できないと判断した場合にも回収を行い、生存時間は、−XX:S o f t R f L RUPPolicyMSPerMBによって制御することができ、MB毎のスタック空間におけるSofteReferenceの生存時間を意味し、デフォルトでは1秒である.
弱い参照:
GCさえあれば、回収されます.現在のCPUの性能は比較的に高くて、1つのCPUの時間は周期を回転して、コードを処理することができて、だからここで手動でGCをプラスしました.手動GCでないとこの時間帯はGCされないし、GCの場合はsaftpointも汲み上げられる.
ダミー参照:
get()はいつでも空です.ただし、isEnqueued()をテストすると、参照オブジェクトのメモリ内の状態がGCされているかどうかを監視できます.
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
public class A
{
public static void main(String[] args)
{
System.out.println("begin");
User user = new User("SoftReference");
SoftReference<User> softRef = new SoftReference<User>(user);
System.out.println("user SoftReference hase been GC : " + softRef.isEnqueued());
user = null;
System.out.println("user SoftReference hase been GC : " + softRef.isEnqueued());
System.gc();
System.out.println("user SoftReference hase been GC : " + softRef.isEnqueued());
System.out.println("1 :" + (softRef.get() == null));
System.out.println(softRef.get().getName());
System.out.println();
user = new User("WeakReference");
WeakReference<User> weakRef = new WeakReference<User>(user);
System.out.println("2 :" + (weakRef.get() == null));
System.out.println("user WeakReference hase been GC : " + weakRef.isEnqueued());
user = null;
System.out.println("user WeakReference hase been GC : " + weakRef.isEnqueued());
System.out.println("3 :" + (weakRef.get() == null));
System.gc();
System.out.println("user WeakReference hase been GC : " + weakRef.isEnqueued());
System.out.println("4 :" + (weakRef.get() == null));
System.out.println();
user = new User("PhantomReference");
ReferenceQueue<User> refQueue = new ReferenceQueue<User>();
PhantomReference<User> phantomRef = new PhantomReference<User>(user, refQueue);
System.out.println("5 :" + (phantomRef.get() == null));
System.out.println("user PhantomReference hase been GC : " + phantomRef.isEnqueued());
user = null;
System.out.println("user PhantomReference hase been GC : " + phantomRef.isEnqueued());
System.gc();
System.out.println("user PhantomReference hase been GC : " + phantomRef.isEnqueued());
}
}
class User
{
private String name;
public User(String name)
{
this.name = "HELLO WORLD";
}
public String getName()
{
return name;
}
}
実行結果:
begin
user SoftReference hase been GC : false
user SoftReference hase been GC : false
user SoftReference hase been GC : false
1 :false
HELLO WORLD
2 :false
user WeakReference hase been GC : false
user WeakReference hase been GC : false
3 :false
user WeakReference hase been GC : false
4 :true
5 :true
user PhantomReference hase been GC : false
user PhantomReference hase been GC : false
user PhantomReference hase been GC : true
ソフトリファレンス分析:
一般的にキャッシュに使用され、JVMメモリが不足している場合にのみGCされるため、user=nullとなり、その後もGCされません.JVMのヒープメモリを小さく設定するだけで、GC効果を設定する可能性があります.また、GCは、スキャンしたSoftReferenceが頻繁に使用できないと判断した場合にも回収を行い、生存時間は、−XX:S o f t R f L RUPPolicyMSPerMBによって制御することができ、MB毎のスタック空間におけるSofteReferenceの生存時間を意味し、デフォルトでは1秒である.
弱い参照:
GCさえあれば、回収されます.現在のCPUの性能は比較的に高くて、1つのCPUの時間は周期を回転して、コードを処理することができて、だからここで手動でGCをプラスしました.手動GCでないとこの時間帯はGCされないし、GCの場合はsaftpointも汲み上げられる.
ダミー参照:
get()はいつでも空です.ただし、isEnqueued()をテストすると、参照オブジェクトのメモリ内の状態がGCされているかどうかを監視できます.