【发布时间】:2020-10-07 11:58:15
【问题描述】:
我试图了解-XX:G1ReservePercent 的实际作用。我在official documentation找到的描述不是很全面:
设置保留内存的百分比以保持空闲以减少 空间溢出的风险。默认值为 10%。当你 增加或减少百分比,确保调整总数 相同数量的 Java 堆。
to-space耗尽日志条目的描述是这样的:
当您在日志中看到空间溢出/用尽消息时,G1 GC 没有足够的内存供幸存者或提升者使用 对象,或两者兼而有之。
[...]
为缓解此问题,请尝试以下调整:
增加
-XX:G1ReservePercent选项的值(以及总 相应地堆)以增加“to-space”的保留内存量。[...]
从引用to-space exhausted 来看,意味着在执行混合疏散时,我们没有足够的空闲区域来转移幸存者。
但这与以下official tuning advice in case of Full GC(强调我的)相矛盾:
强制 G1 提前开始标记。 G1 自动确定 基于之前的启动堆占用百分比 (IHOP) 阈值 应用程序行为。如果应用程序行为发生变化,这些 预测可能是错误的。有两种选择:降低目标 何时通过增加缓冲区开始空间回收的占用 通过修改在自适应 IHOP 计算中使用
-XX:G1ReservePercent;
那么缓冲区是什么,设置-XX:G1ReservePercent 有什么作用(乍一看,AdaptiveIHOP 与它无关......)?
它是否总是保留一些堆空间,所以当混合疏散发生时,我们总是有空闲的 regiong 可以将幸存者移动到?
还是空间用于 G1 内部管家任务?如果是这样,不清楚目标空间包含哪些数据,所以它已经用尽了?
【问题讨论】: