Java 几种引用

Java中存在四种引用:强引用、软引用、弱引用、虚引用。

强引用

强引用(Strong Reference):是最普通的引用类型,只要强引用存在,GC就不会进行垃圾回收。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。

强引用,例如Object obj = new Object();
可以使用obj = null;来帮助垃圾收集器回收此对象。

软引用

软引用(Soft Reference):用来描述一些有用但是非必需的对象。如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。软引用可用来实现内存敏感的高速缓存。

软引用,例如SoftReference<Object> softRef = new SoftReference<>(obj);

弱引用

弱引用(Weak Reference):是一种生命周期比软引用更短的引用。当GC扫描启动时,只要扫描到只具有弱引用的对象,无论内存是否够用都会执行GC,但由于GC线程优先级很低,因此并不一定能迅速发现这些弱引用对象。弱引用也可以和一个引用队列联合使用。

虚引用

虚引用(Phantom Reference):不同于其余三种引用,虚引用不会影响对象的生命周期,也无法通过虚引用获得对象的一个实例;如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。虚引用主要用来跟踪对象被垃圾回收器回收的活动,它必须和引用队列(ReferenceQueue)联合使用。

程序可以通过检测与虚引用关联的虚引用队列是否已经包含了指定的虚引用,从而了解虚引用的对象是否即将被回收。


感谢:
http://www.sczyh30.com/posts/Java/java-reference-type/