首页 > 解决方案 > 为什么一旦 GC 运行,所有符合 GC 条件的对象都不会被销毁?

问题描述

如果 1M 个对象符合 GC 条件,则该对象的某些部分在 GC 运行时被销毁(即 20k 个对象)。为什么一旦 GC 运行,所有符合 GC 条件的对象都不会被销毁?

标签: javagarbage-collection

解决方案


这取决于。例如G1有一个名为 的设置MaxGCPauseMillis,默认情况下是200ms。垃圾收集器算法可以决定在它拥有的 100 个年轻区域中,它可以在该200 ms时间范围内处理其中的 80 个(基于先前收集的统计数据)。因此,它不会遍历所有区域,而仅适用于某些区域。同样的事情发生在G1 mixed collections- 当扫描年轻区域加上一些旧区域时,不是所有的。

并且对象不会被破坏。垃圾收集器算法扫描活动实例(从一些 GC 根开始),剩下的一切都是垃圾。典型的收集器会扫描某个区域,找到所有活着的东西,将其移动到不同的(空)区域 - 并且该初始区域将被标记为“空”,这意味着它里面的任何东西都不再需要了。这现在被称为“垃圾”。


推荐阅读