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

68bkxrlz  于 2023-01-16  发布在  Java
关注(0)|答案(5)|浏览(261)

我目前正在寻找最新的Java8版本中的G1GC。
我对“巨大的分配”有疑问,所以我想知道我的区域大小。
我怎样才能知道区域大小设置得有多大?
我如何自己计算区域大小?
谢谢

mzmfm0qo

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之间)。
通常,这些是每个堆大小范围的区域大小:

<4GB -  1MB
 <8GB -  2MB
<16GB -  4MB
<32GB -  8MB
<64GB - 16MB
64GB+ - 32MB
  • 注意,MB实际上是MiB,GB实际上是GiB*
dgsult0t

dgsult0t2#

区域大小由JVM在启动时根据堆的大小计算。堆的默认值是物理内存的1/4或1GB(取较小值)。请参考this
区域大小可以从1 MB到32 MB不等,具体取决于堆大小。目标是区域不超过2048个。
您可以通过在启动脚本中指定-XX:G1HeapRegionSize=XX来覆盖该大小。

ikfrs5lh

ikfrs5lh3#

关于“我如何知道区域大小设置为多大?",您可以使用-Xlog:gc*标志(Java 9或更高版本)启动java,而不是计算,该标志应该在最开始打印:

[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
v1uwarro

v1uwarro4#

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

t5zmwmid5#

  1. jps查找java程序pid
  2. jmap -heap pid
  3. G1HeapRegionSize是JVM计算的区域大小
    例如:
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

相关问题