Java中有四种引用类型
分为:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)4 种,这 4 种引用的强度依次减弱。
强引用 | 软引用 | 弱引用 | 虚引用 | |
---|---|---|---|---|
英语 | Strong Reference | Soft Reference | Weak Reference | Phantom Reference |
示例 | Object obj = new Object(); | SoftReference<byte[]> sr = new SoftReference<>(buff | WeakReference<byte[]> sr = new WeakReference<>(buff); | PhantomReference phantomReference = new PhantomReference<>(obj, QUEUE); |
垃圾回收时机 | 只要强引用存在,垃圾回收器将永远不会回收被引用的对象,哪怕内存不足时,JVM也会直接抛出OutOfMemoryError,不会去回收。如果想中断强引用与对象之间的联系,可以显示的将强引用赋值为null,这样一来,JVM就可以适时的回收对象了 | 在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。 | 无论内存是否足够,只要 JVM 开始进行垃圾回收,那些被弱引用关联的对象都会被回收。 | 如果一个对象仅持有虚引用,那么它就和没有任何引用一样,它随时可能会被回收 |
用途 | 实现缓存技术,比如网页缓存,图片缓存等 | 使用虚引用的目的就是为了得知对象被GC的时机,所以可以利用虚引用来进行销毁前的一些操作,比如说资源释放等。这个虚引用对于对象而言完全是无感知的,有没有完全一样,但是对于虚引用的使用者而言,就像是待观察的对象的把脉线,可以通过它来观察对象是否已经被回收,从而进行相应的处理。 |