欢迎关注头条号:Java小野猫
前言 总所周知,jvm的垃圾收集算法一般包括标记、清除、整理三个阶段,最近在看了有关于垃圾收集的标记算法,记录一下自己的理解。
垃圾收集中标记算法有两种:一种是引用计数法,一种是根搜寻算法。
引用记数法 引用计数法非常容易理解,jvm为每一个物件设立一个引用计数器,当该物件被引用时,计数器就加一,引用取消时则减一。
当jvm开始gc时,jvm判断该物件的引用计数器是否为0,若为0则标记为可清除物件。


引用计数器有个致命的缺点是无法解决循环依赖问题,这也导致这个算法被弃用。
如下图所示,当物件A中有对B的引用,物件B中也有对A的引用,两者之间形成循环依赖。
除此之外,还有一个point引用了物件A,此时程式中还有point这个指标能够使程式到达这两个物件,
一旦point引用取消,我们就会丢失对这两个物件的控制,同时引用计数器未到达0,所以物件一直存在在堆中,JVM不能进行回收,从此造成内存泄漏。

根搜寻算法根搜寻算法是目前大部分JVM所使用的标记算法。
根搜寻算法会以根物件集合中的根物件出发,进行自上往下的搜寻,与根物件直接连线或间接连线的物件都可以被搜寻。
当JVM无法到达某个物件时,它会被标记为可清除物件。
根物件集合指的是:
JAVA栈中的物件引用本地方法栈的物件引用执行时常量池中的物件引用方法区中的类静态属性的物件引用类对应的唯一资料型别的Class物件(这句话有点抽象,实际上每个类都有一个Class物件用于表示这个类在执行时被JVM载入的相关资讯,如类名、方法、属性等) 可以使用ClassName.class、例项化物件.class、Class.forName(),获取该类的Class物件
根搜寻算法的过程

私信头条号,传送:“资料”,获取更多“秘制” 精品学习资料
如有收获,请帮忙转发,您的鼓励是作者最大的动力,谢谢!





























