我目前正在寻找最新的Java8版本中的G1GC。我对“巨大的分配”有疑问,所以我想知道我的区域大小。我怎样才能知道区域大小设置得有多大?我如何自己计算区域大小?谢谢
mzmfm0qo1#
Java-8中的G1区域大小基于startingHeapSize/2048,并在1 MB和32 MB之间向下舍入到2的1次幂;不支持区域大小〈1 MB或〉32 MB。你也可以通过-XX:G1HeapRegionSize=n设置region-size(注意,该值具有相同的2的幂/范围限制)。因此实际上JVM似乎偏向于2048到4095之间的区域计数(假设堆在2GB到128 GB之间)。通常,这些是每个堆大小范围的区域大小:
startingHeapSize/2048
-XX:G1HeapRegionSize=n
<4GB - 1MB <8GB - 2MB <16GB - 4MB <32GB - 8MB <64GB - 16MB 64GB+ - 32MB
dgsult0t2#
区域大小由JVM在启动时根据堆的大小计算。堆的默认值是物理内存的1/4或1GB(取较小值)。请参考this。区域大小可以从1 MB到32 MB不等,具体取决于堆大小。目标是区域不超过2048个。您可以通过在启动脚本中指定-XX:G1HeapRegionSize=XX来覆盖该大小。
-XX:G1HeapRegionSize=XX
ikfrs5lh3#
关于“我如何知道区域大小设置为多大?",您可以使用-Xlog:gc*标志(Java 9或更高版本)启动java,而不是计算,该标志应该在最开始打印:
-Xlog:gc*
[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
v1uwarro4#
要查看区域大小,请使用jinfo -flags your_pid
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
t5zmwmid5#
jps
jmap -heap pid
G1HeapRegionSize
using thread-local object allocation. Garbage-First (G1) GC with 8 thread(s) Heap Configuration: MinHeapFreeRatio = 30 MaxHeapFreeRatio = 50 ............................. MaxHeapSize = 12884901888 (12288.0MB) G1HeapRegionSize = 4194304 (4.0MB) Heap Usage: G1 Heap: regions = 3072 capacity = 12884901888 (12288.0MB) used = 4050405416 (3862.7676162719727MB) free = 8834496472 (8425.232383728027MB) 31.435283335546654% used
5条答案
按热度按时间mzmfm0qo1#
Java-8中的G1区域大小基于
startingHeapSize/2048
,并在1 MB和32 MB之间向下舍入到2的1次幂;不支持区域大小〈1 MB或〉32 MB。你也可以通过
-XX:G1HeapRegionSize=n
设置region-size(注意,该值具有相同的2的幂/范围限制)。因此实际上JVM似乎偏向于2048到4095之间的区域计数(假设堆在2GB到128 GB之间)。
通常,这些是每个堆大小范围的区域大小:
dgsult0t2#
区域大小由JVM在启动时根据堆的大小计算。堆的默认值是物理内存的1/4或1GB(取较小值)。请参考this。
区域大小可以从1 MB到32 MB不等,具体取决于堆大小。目标是区域不超过2048个。
您可以通过在启动脚本中指定
-XX:G1HeapRegionSize=XX
来覆盖该大小。ikfrs5lh3#
关于“我如何知道区域大小设置为多大?",您可以使用
-Xlog:gc*
标志(Java 9或更高版本)启动java,而不是计算,该标志应该在最开始打印:v1uwarro4#
要查看区域大小,请使用
jinfo -flags your_pid
t5zmwmid5#
jps
查找java程序pidjmap -heap pid
G1HeapRegionSize
是JVM计算的区域大小例如: