Java:对CMS垃圾收集器感到困惑

时间:2017-12-29 18:25:18

标签: java garbage-collection jvm

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

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

1 个答案:

答案 0 :(得分:1)

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

Mark-Sweep GC反过来说:它首先找到仍然可以到达的所有对象,然后回收所有其他对象的内存。

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

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