jvm-标记阶段的GC算法
一: 引用计数法
定义: 每个对象保存一个整形的引用计数器属性,用于记录对象的引用情况. 实现: 对于对象A,只要有任一对象引用了A,计数器就加一,当引用失效,计数器就减一,只要对象A的引用计数器为0,即表示对象A为垃圾对象,既可以回收了. 优点: 实现简单,垃圾对象容易辨识,判定效率高,回收没有延迟性 缺点: 1,需要单独的字段存储计数器,增加了内存开销 2,每次赋值都需要更新计数器,伴随着加法和减法操作,增加了时间开销 3,无法处理循环引用:这是最严重的缺陷,直接导致了Java的垃圾收集器中没有使用这种算法
二: 可达性分析算法(根搜索算法,追踪性垃圾收集)
hostspot虚拟机使用该算法
是以GCRoots为起始点,内存中存活的对象都会被根对象集合(GCRoots)直接或间接的连接着,称为引用链.
如果对象没有任何引用链相连,这是不可达的,意味着该对象已死亡,可以标记为垃圾对象.
再可达性分析算法中,只有被根对象集合的引用链链接的对象,才是存活对象.
GCRoot组成:
jvm中对象的三种状态:
1,可触及的: 从根节点可以到达该对象
2, 可复活的: 对象的所有引用都被释放,但是该对象有可能再finalize()方法中复活
@Override protected void finalize() throws Throwable { super.finalize(); instance = this; }
3,不可触及的: 对象没有任何被引用,finalize()被调用,并且没有被复活,就会进入不可触及状态.不可触及状态的对象不可能被复活,因为finalize()方法只被调用一次