java - 为什么一旦 GC 运行,所有符合 GC 条件的对象都不会被销毁?
问题描述
如果 1M 个对象符合 GC 条件,则该对象的某些部分在 GC 运行时被销毁(即 20k 个对象)。为什么一旦 GC 运行,所有符合 GC 条件的对象都不会被销毁?
解决方案
这取决于。例如G1
有一个名为 的设置MaxGCPauseMillis
,默认情况下是200ms
。垃圾收集器算法可以决定在它拥有的 100 个年轻区域中,它可以在该200 ms
时间范围内处理其中的 80 个(基于先前收集的统计数据)。因此,它不会遍历所有区域,而仅适用于某些区域。同样的事情发生在G1
mixed collections
- 当扫描年轻区域加上一些旧区域时,不是所有的。
并且对象不会被破坏。垃圾收集器算法扫描活动实例(从一些 GC 根开始),剩下的一切都是垃圾。典型的收集器会扫描某个区域,找到所有活着的东西,将其移动到不同的(空)区域 - 并且该初始区域将被标记为“空”,这意味着它里面的任何东西都不再需要了。这现在被称为“垃圾”。
推荐阅读
- java - 如何从表中获取最近添加的日期
- python - Python Azure 服务总线锁已过期
- ruby-on-rails - CircleCI AWSCLI SyntaxError:非 ASCII 字符“\xc3”错误
- c++ - 我可以创建多个具有相同参数的构造函数吗
- amazon-web-services - AWS CDK 为另一个账户运行“cdk synth”
- flutter - 我刚刚用颤振登录Apple,它不会停止加载
- python - 如何使用 Python 在 Gurobi 中将向量相乘?
- python - 如何矢量化这个 python for 循环?
- javascript - 如何使用 jQuery 和 Flask-WTF 在 TextAreaField 中进行实时字数统计?
- symfony - Symfony - 无法配置反规范化器