Java WeakReference

关于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 weakReference = new WeakReference("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并不会回收掉

你可能感兴趣的:(GC,JVM)