为什么G1GC中的XX:G1HeapRegionSize必须是2的幂?

Why XX:G1HeapRegionSize in G1GC must be power of 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.Can 谁能解释为什么 XX:G1HeapRegionSize 必须 是 2 的幂?

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

Can anyone explain why XX:G1HeapRegionSize must be power of 2 ?

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

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

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

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

Is there any problem in setting 10m heap region for -Xmx12g ?

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