【问题标题】:Java:confused about CMS garbage collectorJava:对 CMS 垃圾收集器感到困惑
【发布时间】:2017-12-29 18:25:17
【问题描述】:

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

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

【问题讨论】:

  • JVM 没有标记 unreachable 对象,因为...它显然无法 reach 它们 :) 我的意思是,通过遍历引用图。为了找到无法访问的对象,JVM 需要遍历整个堆并排除活动对象。

标签: java garbage-collection jvm


【解决方案1】:

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

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

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

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

【讨论】:

  • 坦克,有没有办法找到无法到达的物体?
  • 循环内存查找所有没有被引用的对象,比如引用计数。为什么不用这种方式?
  • 引用计数较差。它不会回收周期,例如A 引用 B,B 引用 A,没有其他引用 A 或 B。两者的引用计数均为 1,因此尽管它们是垃圾,但它们仍保留在内存中。
  • 您问“有没有办法找到无法访问的对象”?垃圾收集器可以,因为他知道内存块在哪里,他必须清除未标记的对象。应用程序不能,因为应用程序可以访问的所有对象都不是垃圾。
猜你喜欢
  • 1970-01-01
  • 2011-11-07
  • 1970-01-01
  • 2014-03-29
  • 2021-04-19
  • 2011-02-23
  • 2010-12-13
  • 2018-10-03
  • 1970-01-01
相关资源
最近更新 更多