JVM堆内存分析,分析工具jmap heap
一、查看堆信息
jmap -heap 33146
Debugger attached successfully.
Server compiler detected.
JVM version is 25.251-b08
using thread-local object allocation.
Garbage-First (G1) GC with 2 thread(s)
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 5265948672 (5022.0MB)
NewSize = 1363144 (1.2999954223632812MB)
MaxNewSize = 3158310912 (3012.0MB)
OldSize = 5452592 (5.1999969482421875MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 536870912 (512.0MB)
CompressedClassSpaceSize = 528482304 (504.0MB)
MaxMetaspaceSize = 536870912 (512.0MB)
G1HeapRegionSize = 2097152 (2.0MB)
Heap Usage:
G1 Heap:
regions = 2511
capacity = 5265948672 (5022.0MB)
used = 5126798672 (4889.29621887207MB)
free = 139150000 (132.7037811279297MB)
97.35755115237097% used
G1 Young Generation:
Eden Space:
regions = 1438
capacity = 3156213760 (3010.0MB)
used = 3015704576 (2876.0MB)
free = 140509184 (134.0MB)
95.54817275747509% used
Survivor Space:
regions = 8
capacity = 16777216 (16.0MB)
used = 16777216 (16.0MB)
free = 0 (0.0MB)
100.0% used
G1 Old Generation:
regions = 1040
capacity = 2092957696 (1996.0MB)
used = 2092219728 (1995.2962188720703MB)
free = 737968 (0.7037811279296875MB)
99.96474042445242% used
38177 interned Strings occupying 4297560 bytes.
二、Heap Configuration参数介绍
1、MinHeapFreeRatio = 40
空闲堆空间的最小百分比,计算公式为:HeapFreeRatio =(CurrentFreeHeapSize/CurrentTotalHeapSize) * 100,值的区间为0到100,默认值为 40。如果HeapFreeRatio < MinHeapFreeRatio,则需要进行堆扩容,扩容的时机应该在每次垃圾回收之后
2、MaxHeapFreeRatio = 70
空闲堆空间的最大百分比,计算公式为:HeapFreeRatio =(CurrentFreeHeapSize/CurrentTotalHeapSize) * 100,值的区间为0到100,默认值为 70。如果HeapFreeRatio > MaxHeapFreeRatio,则需要进行堆缩容,缩容的时机应该在每次垃圾回收之后。
3、MaxHeapSize = 4294967296 (4096.0MB)
JVM 堆空间允许的最大值。
4、NewSize = 1363144 (1.2999954223632812MB)
JVM 新生代堆空间的默认值。
5、MaxNewSize = 2576351232 (2457.0MB)
JVM 新生代堆空间允许的最大值。
6、OldSize = 5452592 (5.1999969482421875MB)
JVM 老年代堆空间的默认值。
7、NewRatio = 2
新生代(2个Survivor区和Eden区 )与老年代(不包括永久区)的堆空间比值,表示新生代:老年代=1:2。
8、 SurvivorRatio = 8
两个Survivor区和Eden区的堆空间比值为 8,表示 S0 : S1 :Eden = 1:1:8。
9、 MetaspaceSize = 21807104 (20.796875MB)
JVM 元空间的默认值。
10、 CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
JVM 元空间允许的最大值。
11、G1HeapRegionSize = 1048576 (1.0MB)
在使用 G1 垃圾回收算法时,JVM 会将 Heap 空间分隔为若干个 Region,该参数用来指定每个 Region 空间的大小。
三、Heap Usage参数介绍
1、G1 Heap:
regions = 4096
capacity = 4294967296 (4096.0MB)
used = 5242880 (5.0MB)
free = 4289724416 (4091.0MB)
0.1220703125% used
G1 的 Heap 使用情况,该 Heap 包含 4096 个 Region,结合上文每个 RegionSize=1M,因此 Capacity = Regions * RegionSize = 4096 * 1M = 4096M,已使用空间为 5M,空闲空间为 4091M,使用率为 0.12%
2、G1 Young Generation:
Eden Space:
regions = 6
capacity = 27262976 (26.0MB)
used = 6291456 (6.0MB)
free = 20971520 (20.0MB)
23.076923076923077% used
G1 的 Eden 区的使用情况,总共使用了 6 个 Region,结合上文每个 RegionSize=1M,因此 Used = Regions * RegionSize = 6 * 1M = 6M,Capacity=26M表名当前 Eden 空间分配了 26 个 Region,使用率为 23%。
3、G1 Young Generation:
Survivor Space:
regions = 0
capacity = 0 (0.0MB)
used = 0 (0.0MB)
free = 0 (0.0MB)
0.0% used
G1 的 Survivor 区的使用情况,同 Eden区。
4、G1 Old Generation:
regions = 0
capacity = 241172480 (230.0MB)
used = 0 (0.0MB)
free = 241172480 (230.0MB)
0.0% used
G1 的 老年代的使用情况,同 Eden区。
四、分析方法
1、获取服务器运行程序的pid
jps -lm
2、查看进程内存信息
pmap -x 1| sort -rn -k3|head -20
3、查看jvm堆信息
jmap -heap pid
4、导出堆内存快照
jmap -dump:live,format=b,file=umetric.hprof pid
5、下载文件到本地
sz umetric.hprof
6、本地分析
jhat -J-d64 -J-mx2g -port 5001 umetric.hprof
参数解释 -J-d64:因为jetty进程是在64位的系统上运行,所以需要指定64位。
-J-mx2g:表示jhat进程最多可以分配2G的堆内存,这就是为什么jhat可以分析超大文件的原因了,因为可以指定堆内存大小。
-port 5001:jhat分析完毕之后,会启动一个web服务,可以通过指定端口来访问,这就是指定的端口。
使用:浏览器访问本地5001端口,拉到最下面有入口可以看到类引用情况
7、查看某个pid资源使用情况,k2是引用个数,k3是费资源大小
jmap -histo pid|sort -rn -k2|head -20
参考文章:https://blog.csdn.net/claram/article/details/104635114