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

How to know region size used of G1 garbage collector?

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

我对 "Humongous Allocation" 有疑问,所以我想知道我的区域大小有多大。

如何知道设置的区域大小有多大?

如何自己计算区域大小?

谢谢

区域大小是JVM在启动时根据堆的大小计算出来的。 堆的默认值是物理内存的 1/4 或 1GB(以较小者为准)。参考 this.

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

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

G1 region-size in Java-8是根据startingHeapSize/2048向下舍入到1MB到32MB之间的2的1次方;不支持 <1MB 或 >32MB 的区域大小。

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

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

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

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

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

关于“我怎样才能知道设置的区域大小有多大?”,而不是计算你可以使用 -Xlog:gc* 标志启动 java(Java 9 或更高版本) ,应该在最开始打印:

[0.003s][info][gc,heap] Heap region size: 1M
[0.004s][info][gc     ] Using G1
[0.004s][info][gc,heap,coops] Heap address: 0x00000000fc000000, size: 64 MB, Compressed Oops mode: 32-bit

要查看区域大小,请使用 jinfo -flags your_pid

Non-default VM flags: -XX:G1HeapRegionSize=1048576 -XX:InitialHeapSize=1054867456 -XX:MarkStackSize=4194304 -XX:MaxHeapSize=5368709120 -XX:MaxNewSize=3221225472 -XX:MinHeapDeltaBytes=1048576 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseG1GC