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



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

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

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

Mark-Sweep GC 则以相反的方式执行此操作:它首先查找仍然可以访问的所有对象,然后回收所有其他对象的内存。

简化的标记扫描算法(当然真正的算法要复杂得多(:

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

最新更新