关于WeakReference的定义引用维基百科定义
在计算机程序设计中,弱引用与强引用相对,是指不能确保其引用的对象不会被垃圾回收器回收的引用。一个对象若只被弱引用所引用,则被认为是不可访问(或弱可访问)的,并因此可能在任何时刻被回收。一些配有垃圾回收机制的语言,如Java、C#、Python、Perl、Lisp等都在不同程度上支持弱引用。
1. WeakReference引用的对象什么时候被回收?
WeakReference所引用的对象,会在垃圾回收发生时被回收,但是是有前提条件的。我们知道垃圾回收分为minorGC 和 majorGC。如果发生若了minorGC,而弱引用指向的对象,只有弱引用,没有其他引用,而且对象在新生代中,才会被回收掉。如果发生了majorGc,如果对象只被弱引用引用,对象会被回收掉。
WeakReference<String> weakReference = new WeakReference<String>(new String("Hello WeakReference"));
System.out.println(weakReference.get());
System.gc();
try {
TimeUnit.MILLISECONDS.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(weakReference.get());
输出结果如下
Hello WeakReference
[GC (System.gc()) 883K->472K(9728K), 0.0008970 secs]
[Full GC (System.gc()) 472K->381K(9728K), 0.0125556 secs]
null
如上证实了发生gc 只有WeakReference指向的对象会被回收掉
2.考虑这种情况呢
WeakReference<String> weakReference = new WeakReference<String>("Hello WeakReference");
System.out.println(weakReference.get());
System.gc();
try {
TimeUnit.MILLISECONDS.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(weakReference.get());
输出结果如下
Hello WeakReference
[GC (System.gc()) 887K->504K(9728K), 0.0124477 secs]
[Full GC (System.gc()) 504K->381K(9728K), 0.0300315 secs]
Hello WeakReference
为什么这种情况下没有被回收掉呢?原因是”Hello WeakReference”是分配在常量池中,并不是分配在java堆中java gc并不会回收掉