Bootstrap

强引用,软引用,弱引用,虚引用

一,强引用

Student student = new Student(); // 这就是强引用

强引用表示一个对象处在【有用,必须】的状态,是使用最普遍的引用,

当JVM内存空间不足,JVM宁愿抛出OutOfMemoryError运行时错误(OOM),使程序异常终止,也不会靠随意回收具有强引用的“存活”对象来解决内存不足的问题。

 

如果没有其他的引用关系,只要超过了引用的作用域或者显式地将相应(强)引用赋值为 null,就是可以被垃圾收集的了。

 

 

二,软引用

Student student = new Student(); SoftReference softReference = new SoftReference(student);

软引用表示一个对象处在【有用,但非必须】的状态。在内存空间足够的情况下,如果一个对象只具有软引用,那么垃圾回收器就不会回收它,但是如果内存空间不足,垃圾回收器就会回收这个对象(回收发生在OutOfMemoryError错误之前)

 

 

三,弱引用

Student student = new Student(); WeakReference weakReference = new WeakReference(student);

弱引用表示一个对象处在【可能有用,但非必须】的状态。类似于软引用,但是强度比软引用更弱一些:只具有弱引用的对象拥有更短暂的生命周期。GC线程在扫描它所管辖的内存区域的过程中,一旦发现只具有弱引用的对象,就会回收掉这些被弱引用关联的对象。

 

 

四,虚引用

ReferenceQueue queue = new ReferenceQueue ();

PhantomReference pr = new PhantomReference (object, queue);

虚引用表示一个对象处在【无用】的状态。这意味着虚引用等同于没有引用,在任何时候都可能被GC回收。

GC在回收一个对象时,如果发现该对象具有虚引用,那么在回收之前就会首先将该对象的虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是否已经加入虚引用来了解被引用的对象是否将要被GC回收。

 

 

总结:强引用:即使发生oom也不会被gc回收,软引用:在内存不够时,会被gc回收,弱引用:只要发生gc就会被回收,虚引用:随时会被gc回收。

 

参考文章:https://www.jianshu.com/p/70e1900c1b33

;