我知道CMS垃圾收集器使用标记清除算法,我很好奇它如何标记对象。

CMS初始标记:为什么它标记可到达的对象而不是标记不可到达的对象?

最佳答案

垃圾收集器的任务是通过遵循访问程序链中的任何步骤来查找程序无法再访问的对象,并回收它们所占用的内存。

Mark-Sweep GC的处理方法与此相反:首先查找仍然可以到达的所有对象,然后回收所有其他对象的内存。

简化的Mark-Sweep算法(当然,真正的算法要复杂得多):


从所有直接可访问的引用开始,例如堆栈上的局部变量(来自所有尚未完成的方法调用的参数和局部变量),静态字段等。
标记他们指向的对象。
递归检查新标记的对象。标记由其字段引用的对象。
重复直到不再获得新标记。
逐个对象遍历您的内存,并回收每个对象的内存而没有标记。
最后去除所有标记。

10-07 23:43