在Java垃圾回收之前,需要判断对象是不是已经死掉,只有死掉的对象才能被GC回收,那么如何判断一个对象是不是已经死掉了呢?
一. 引用计数法
1. 给对象添加一个引用计数器,每当有一个对象引用它时+1,当引用失效时-1,任何时刻计数器为0的对象就是不可能再被引用的。
2. 实现简单,效率很高,但很难解决对象之间循环引用的问题。
二. 可达性分析
1. 基本思想:通过一系列称为GC Roots的对象作为起始点,从这些点向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,此对象不可达。
2. 在Java中可以作为GC Roots的对象包括以下几种:虚拟机栈中引用的对象;方法区中类静态属性引用的对象;方法区中常量引用的对象;本地方法中JNI(Native方法)引用的对象。
三. 引用
1. 引用分为四种:强引用,软引用,弱引用,虚引用,强度逐渐减弱。
2. 强引用就是程序代码中普遍存在的引用。
3. 软引用是用来描述一些还有用但并非必须的对象。
4. 弱引用也是用来描述非必需对象的,被弱引用关联的对象只能生存到下一次垃圾收集发生之前。
5. 虚引用又被称为幽灵引用或者幻影引用。
四. 生存还是死亡
1. 即使在可达性分析中不可达的对象,也并非是非死不可,只是处于缓刑阶段,要真正死亡至少要经历两次标记,这跟finalize有关。
2. finalize函数比较危险,尽量不用。