对这个知识点不要去死记硬背,要知道 Java
为什么要有不同的引用类型,它们存在的意义是什么?其实之所以划分不同的引用类型,主要作用体现在划分对象不同的可达性和 GC
对对象回收的影响。
四种引用类型分别为强引用,软引用,弱引用和虚引用。
-
所谓强引用,就是我们最常见的普通对象引用,我们
new
出来的对象就是强引用,只要尚且存在强引用指向某一个对象,那就能表明该对象还存活,GC
不能去回收这种对象。需要回收强引用指向的对象,可以等待超出引用区域,或者是显式设置对象为null
,就可以通知让GC
回收,当然实际的回收时间要看GC
策略。 -
软引用
( SoftReference )
,用来描述有用但非必须的对象(换句话说就是可有可无,回收了我也不在意),当系统将要发生内存溢出异常(OutOfMemoryError)
之前,将会把这些对象放进回收范围中进行第二次回收。软引用通常用来实现内存中的缓存,当还有空闲内存时可以暂时保留这些对象,当内存不足时清理掉,这样就保证了使用缓 存的同时,不会耗尽内存。 -
弱引用
(WeakReference)
,同样是描述非必须对象,强度比软引用更弱,被弱引用关联的对象只能生存到下一次垃圾收集发生之前,当垃圾收集器工作时,无论当前内存是否足够,都会回收被弱引用关联的对象。弱引用同样是很多缓存实现的选择。 -
虚引用,最弱的一种引用关系,无法通过虚引用取得一个对象实例,唯一目的是能在这个对象被收集器回收时收到一个系统通知。