简介
1、jmap能够打印给定Java进程、核心文件或远程DEBUG服务器的共享对象内存映射或堆内存的详细信息。
2、如果给定的进程运行在64位虚拟机上,则必须指定 -J-d64选项,例如jmap -J-d64 -heap pid。
3、jmap可能在未来的JDK版本中删除。
可用于内存溢出,泄露等情况的内存分析
使用语法
<no option>
当不使用选项时,jmap打印共享对象映射。
对于加载到目标JVM中的每个共享对象,将打印其开始地址、映射大小和共享对象文件的完整路径。
-dump:[live,]format=b,file=
将Java堆以hprof二进制格式转储到filename文件中。
live是可选参数,如果指定,则只转储堆中的活动对象。
可以使用jhat (Java Heap Analysis Tool)工具来读取分析生产dump文件。
-heap
打印堆摘要 (可以看到新生代,老年代的内存占比等)
Attaching to process ID 327, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.171-b11
using thread-local object allocation.
Parallel GC with 8 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 2147483648 (2048.0MB)
NewSize = 357564416 (341.0MB)
MaxNewSize = 715653120 (682.5MB)
OldSize = 716177408 (683.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 499646464 (476.5MB)
used = 49856184 (47.54656219482422MB)
free = 449790280 (428.9534378051758MB)
9.978292171001934% used
From Space:
capacity = 15204352 (14.5MB)
used = 0 (0.0MB)
free = 15204352 (14.5MB)
0.0% used
To Space:
capacity = 15204352 (14.5MB)
used = 0 (0.0MB)
free = 15204352 (14.5MB)
0.0% used
PS Old Generation
capacity = 1431830528 (1365.5MB)
used = 56643848 (54.01978302001953MB)
free = 1375186680 (1311.4802169799805MB)
3.956044161114576% used
-histo[:live]
e.g. jmap -histo:live pid | head -20
打印堆的直方图。
对于每个Java类,将打印对象数量、内存大小(以字节为单位)和完全限定类名。
VM内部类名以''前缀打印,即打印出来的类名前带的是VM的内部类。
如果指定了live子选项,则只统计活动对象。
num #instances #bytes class name
----------------------------------------------
1: 121998 15572640 [C
2: 5456 4763856 [B
3: 37391 3290408 java.lang.reflect.Method
4: 102825 3290400 java.util.concurrent.ConcurrentHashMap$Node
5: 25700 3203200 [Ljava.lang.Object;
6: 120358 2888592 java.lang.String
7: 16370 1820704 java.lang.Class
jmap -dump:live,format=b,file=/xxx/xx/x/dump.log
导出堆转储文件,可用于离线分析(但如果内存太大,可能会整个线程挂起,卡住动不了了)
参考:
https://zhuanlan.zhihu.com/p/475571429