java 强引用 软引用 弱引用 虚引用 的个人理解!

前些时间自己在用WeakHashMap时对这个弱引用有些不太清楚,后来查了一些资料总算弄清楚了,下面是我的一个测试代码
public class ReferenceTest {
	public static void main(String[] args) {
		ReferenceQueue<String> rq=new ReferenceQueue<String>();//引用队列
		//强引用:只要引用存在,其对象就不会被垃圾回收
		String str=new String("str--StrongReference");
		//软引用:在垃圾回收时,发现内存不够时才会回收
		SoftReference<String> sr=new SoftReference<String>("str--SoftReference");
		//弱引用:在垃圾回收时,直接回收
		WeakReference<String> wr=new WeakReference<String>("str--WeakReference");
		//虚引用:对对象的生命周期完全不相关,只是当它指向的对象被回收时,虚引用会被加入到rq中.
		PhantomReference<String> pr =new PhantomReference<String>("str--PhantomReference",rq);
		System.out.println("-----------------before gc------------------");
		System.out.println(str);
		System.out.println(sr.get());
		System.out.println(wr.get());
		System.out.println(pr.get());
		Reference<? extends String> r=null;
		while((r=rq.poll())!=null){
			System.out.println("ReferenceQueue:"+" ref:"+r.toString()+" value:"+r.get());
		}
		System.gc();
		System.out.println("-----------------after gc------------------");
		System.out.println(str);
		System.out.println(sr.get());
		System.out.println(wr.get());
		System.out.println(pr.get());
		while((r=rq.poll())!=null){
			System.out.println("ReferenceQueue:"+" ref:"+r.toString()+" value:"+r.get());
		}
	}
}
下面是在我机器上运行的结果
-----------------before gc------------------
str--StrongReference
str--SoftReference
str--WeakReference
null
-----------------after gc------------------
str--StrongReference
str--SoftReference
null
null
ReferenceQueue: ref:java.lang.ref.PhantomReference@c17164 value:null
注意:ReferenceQueue: ref:java.lang.ref.PhantomReference@c17164 value:null 这一句打印出来,说明虚引用所指向的对象已经被垃圾回收器销毁了.  

你可能感兴趣的:(java)