如何知道G1垃圾回收器使用的区域大小?

2022-09-03 09:41:18

我目前正在研究最新的Java 8版本中的G1 GC。

我在“巨型分配”方面遇到问题,因此我想知道我的区域大小有多大。

如何了解区域大小设置的大小?

如何自行计算区域大小?

谢谢


答案 1

Java-8 中的 G1 区域大小基于 1MB 和 32MB 之间的第一次幂 2 并向下舍入;不支持区域大小 <1MB 或 >32MB。startingHeapSize/2048

您还可以通过 设置区域大小(注意,该值具有相同的 2 次幂/范围限制)。-XX:G1HeapRegionSize=n

因此,实际上JVM似乎偏向于2048和4095之间的区域计数(假设堆在2GB和128GB之间)。

通常,这些是每个堆大小的区域大小范围:

 <4GB -  1MB
 <8GB -  2MB
<16GB -  4MB
<32GB -  8MB
<64GB - 16MB
64GB+ - 32MB

请注意,MB 实际上是 MiB,而 GB 实际上是 GiB


答案 2

区域大小由 JVM 在启动期间根据堆的大小计算。堆的默认值为物理内存的 1/4 或 1GB(以较小者为准)。请参考此内容

区域大小可以从 1 MB 到 32 MB 不等,具体取决于堆大小。目标是拥有不超过2048个区域。

您可以通过在启动脚本中指定来覆盖大小。-XX:G1HeapRegionSize=XX


推荐