请教jcmd GC.heap_info输出中'heap total'的具体含义
问题:jcmd GC.heap_info中
heap total 3063808K的含义 想请教:在以下jcmd GC.heap_info的输出中,heap total 3063808K具体代表什么含义?
root@ip-10-210-3-44:/app# jcmd 34 GC.heap_info 34: garbage-first heap total 3063808K, used 1095736K [0x0000000380000000, 0x0000000800000000) region size 16384K, 14 young (229376K), 6 survivors (98304K) Metaspace used 396721K, committed 401984K, reserved 1400832K class space used 48373K, committed 51328K, reserved 1048576K
补充信息
jps -lvm输出
root@ip-10-210-3-44:/app# jps -lvm 34 /app/spring-boot-application.jar -XX:+UseContainerSupport -XX:MaxRAMPercentage=75 -XX:NativeMemoryTracking=summary -XX:+UseG1GC -Xlog:gc --add-modules=jdk.incubator.foreign --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.math=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.text=ALL-UNNAMED --add-opens=java.sql/java.sql=ALL-UNNAMED --add-opens=java.base/java.time=ALL-UNNAMED -Djava.security.egd=file:/dev/./urandom -Dcontainer.id= 30533 jdk.jcmd/sun.tools.jps.Jps -lvm -Dapplication.home=/opt/openjdk-17 -Xms8m -Djdk.module.main=jdk.jcmd
- 容器总内存:24 GB
Java版本信息
openjdk version "17.0.5" 2022-10-18 OpenJDK Runtime Environment Temurin-17.0.5+8 (build 17.0.5+8) OpenJDK 64-Bit Server VM Temurin-17.0.5+8 (build 17.0.5+8, mixed mode, sharing)
jmap堆信息输出
root@ip-10-210-3-44:/app# jhsdb jmap --heap --pid 34 Attaching to process ID 34, please wait... Debugger attached successfully. Server compiler detected. JVM version is 17.0.5+8 using thread-local object allocation. Garbage-First (G1) GC with 4 thread(s) Heap Configuration: MinHeapFreeRatio = 40 MaxHeapFreeRatio = 70 MaxHeapSize = 19327352832 (18432.0MB) NewSize = 1363144 (1.2999954223632812MB) MaxNewSize = 11593056256 (11056.0MB) OldSize = 5452592 (5.1999969482421875MB) NewRatio = 2 SurvivorRatio = 8 MetaspaceSize = 22020096 (21.0MB) CompressedClassSpaceSize = 1073741824 (1024.0MB) MaxMetaspaceSize = 17592186044415 MB G1HeapRegionSize = 16777216 (16.0MB) Heap Usage: G1 Heap: regions = 1152 capacity = 19327352832 (18432.0MB) used = 1382900640 (1318.8368225097656MB) free = 17944452192 (17113.163177490234MB) 7.1551476915677386% used G1 Young Generation: Eden Space: regions = 28 capacity = 1677721600 (1600.0MB) used = 469762048 (448.0MB) free = 1207959552 (1152.0MB) 28.0% used Survivor Space: regions = 1 capacity = 16777216 (16.0MB) used = 16777216 (16.0MB) free = 0 (0.0MB) 100.0% used G1 Old Generation: regions = 57 capacity = 1442840576 (1376.0MB) used = 896361376 (854.8368225097656MB) free = 546479200 (521.1631774902344MB) 62.124769077744595% used
解答
heap total 3063808K(约2992MB)指的是当前JVM已向操作系统申请、并可用于G1堆的内存总量,也就是已提交的堆内存,和堆的最大可分配内存(MaxHeapSize)不是一回事。
结合你的配置和输出可以明确:
- 容器总内存24GB,JVM参数
-XX:MaxRAMPercentage=75设置堆最大为容器内存的75%,即18GB(18432MB),这和jmap输出的MaxHeapSize = 19327352832 (18432.0MB)完全一致。 - G1是动态扩容的垃圾回收器:JVM不会一开始就占用全部最大堆内存,而是根据应用的实际内存需求,逐步向操作系统申请内存。
total 3063808K就是当前实际申请到的堆内存,后续如果内存需求增加,这个值会逐步提升,直到达到MaxHeapSize的上限。 - 对比jmap里的
capacity = 19327352832 (18432.0MB)(堆的最大容量),就能看出两者的差异——当前应用内存需求不大,所以JVM只申请了约3GB堆内存,剩余的堆空间会在需要时再向操作系统申请。
另外,输出里的used 1095736K是当前堆中实际存放对象的内存大小,已提交内存(total)减去已使用内存(used)就是当前堆里的空闲内存。
内容的提问来源于stack exchange,提问作者tuk
相关产品推荐
相关产品推荐

