如何判断一个对象已经死亡?
堆内存中几乎存放着所有对象的实例,对垃圾回收前的第一步就是要判断哪些对象已经死亡
引用计数法
给对象中添加一个引用计数器,每当有一个地方引用它,计数器就 +1,当引用失效,计数器就 -1;任何时候计数器为 0 的对象就是不可能再被使用的
可达性分析算法
这个算法的基本思想是通过一系列的称为“GC Roots”的对象作为起点,从这些节点开始向下搜索,节点所走过的路径称为引用链,当一个对象到“GC Roots”没有任何引用链相连的话,则证明此对象是不可用的
引用
无论是通过计数法判断引用数量,还是通过可达性分析法判断的引用链是否可达,判定对象的存活都与“引用”有关。Java 对引用的概念进行了扩充,将引用分为强引用、软引用、弱引用、虚引用四种。
强引用:必不可少的
强引用是使用最普遍的引用。如果一个对象具有强引用,那它属于“必不可少的”,GC 绝不会回收它。当内存空间不足时,JVM 宁愿抛出 OOM 异常使程序终止,也不会靠随意回收具有强引用的对象来解决内存不足问题
软引用:可有可无的
GC 操作时,如果内存空间足够,GC 不会回收具有软引用的对象,只有当内存空间不足时,才会回收这些对象的内存。
弱引用:可有可无的
弱引用和软引用的区别在于:只具有弱引用的对象拥有更短的生命周期。GC 操作时,一旦发现了只具有弱引用的对象,那么不管当前内存空间足够与否,都会回收它的内存
虚引用:形同虚设的
虚引用顾名思义就是形同虚设的,与其他几种引用都不同,它不会决定对象的生命周期,如果一个对象仅持有虚引用,那么它和没有任何引用一样,在任何时候都可能会被回收