首页 > 解决方案 > 为什么 G1GC 中的 XX:G1HeapRegionSize 必须是 2 的幂?

问题描述

Oracle 文档https://docs.oracle.com/javase/9 ​​/gctuning/garbage-first-garbage-collector.htm#JSGCT-GUID-98E80C82-24D8-41D4-BC39-B2583F04F1FF 说 XX:G1HeapRegionSize必须是2 但在 1m 到 32m 之间设置任何值没有限制。

问题 :

1.谁能解释为什么 XX:G1HeapRegionSize必须是 2 的幂?

2.对于处理大量巨大对象的应用程序,经过大量测试和分析GC原因,GC吞吐量,GC暂停时间等,设置XX:G1HeapRegionSize = 10m似乎是合适的。为 -Xmx12g 设置 10m 堆区域有什么问题吗?

标签: g1gc

解决方案


谁能解释为什么 XX:G1HeapRegionSize 必须是 2 的幂?

仅仅因为这就是 Oracle 实现 G1 收集器的方式。

在实现诸如垃圾收集器之类的东西时,您需要做出设计选择以使其正常工作。G1 设计师做出这些特殊选择的原因可能有很多。总体主题将是优化关键 G1 代码路径(例如写屏障)的性能和/或避免整个 G1 代码库中不必要的复杂性。

(例如,如果一个区域的大小是 2 的幂,并且每个区域都从一个可以被区域大小整除的地址开始,那么您可以使用掩码来有效地计算一个地址属于哪个区域。如果您可以在写屏障代码中保存一些指令,这可能意味着整个 JVM 的几个百分点的性能。我不会更详细地介绍......但你可以查阅文献。)

但原因尚无定论。您要么接受 G1 限制,要么选择更适合您的用例的不同垃圾收集器。

为 -Xmx12g 设置 10m 堆区域有什么问题吗?

嗯......它不会工作......因为你已经找到了限制。


推荐阅读