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

时间:2017-10-17 09:15:21

标签: java g1gc

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

我有“Humongous Allocation”的问题,所以我想知道我的区域大小有多大。

如何确定区域大小的设置有多大?

我如何自己计算区域大小?

由于

4 个答案:

答案 0 :(得分:3)

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

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

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

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

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

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

答案 1 :(得分:2)

关于“如何找出设置的区域大小?”,您可以使用-Xlog:gc*标志(Java 9或更高版本)启动Java,而不用计算它,而该标志应该在一开始就打印:< / p>

[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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

要查看区域大小,请使用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