关于WeakReference被回收的时机

上一篇我讲到了关于SoftReference在什么情况下会被垃圾回收器所回收,这一篇我将用代码来验证WeakReference在什么情况下会被垃圾回收器所回收,究竟是在FULL GC的时候被清除还是在GC的时候被清除。
直接上代码:

public class WeakReferenceTest {
	public static void main(String[] args) {
		WeakReference weakReference=new WeakReference(new Object());
		System.out.println("beforeGC:"+weakReference.get());
		List list=new ArrayList<>();
		for(int i=0;i<100;i++){
			list.add(new Byte[1024]);
		}
		System.out.println("afterGC:"+weakReference.get());
	}
}

JVM参数:

-verbose:gc -Xmx5m

运行代码可以在控制台看到下面的信息:

beforeGC:java.lang.Object@6d06d69c
[GC (Allocation Failure)  1024K->980K(5632K), 0.0015905 secs]
afterGC:null

从控制台打印信息的第一行和第三行可以看出,在GC之前该对象是能够获取到的,在GC之后该对象就已经被垃圾回收器所回收。
结论:
1.只要发生了GC,WeakReference就会被垃圾回收器所回收
2.一般用weak reference作为缓存,该缓存对象应当是有价值的, 而且很容易被重新被构建, 且很消耗内存的对象

你可能感兴趣的:(引用类型)