jmap简介
jmap(JVM Memory Map)一方面可以获取dump文件(堆转储快照文件,二进制文件),它还可以获取目标Java进程的内存相关信息,包括Java堆各区域的使用情况、堆中对象的统计信息、类加载信息等。
选项 | 作用 |
---|---|
-dump | 生成dump文件 |
-finalizerinfo | 以ClassLoader为统计口径输出永久代的内存状态信息 |
-heap | 输出整个堆空间的详细信息,包括GC的使用、堆配置信息,以及内存的使用信息等 |
-histo | 输出堆空间中对象的统计信息,包括类、实例数量和合计容量 |
-permstat | 以ClassLoader为统计口径输出永久代的内存状态信息 |
-F | 当虚拟机进程对-dump选项没有任何响应时,强制执行生成dump文件 |
1)导出内存映像文件
Heap dump又称为堆转储文件,指一个Java进程在某个时间点的内存快照。
注:通常在写Heap dump文件之前,会执行一次Full GC,所以heap dump中保存的都是Full GC后留下的对象信息。
手动导出
[root@bogon ~]# jmap -dump:format=b,file=/opt/1.hprof 12023
Dumping heap to /opt/1.hprof ...
Heap dump file created
[root@bogon ~]# jmap -dump:live,format=b,file=/opt/2.hprof 12023
Dumping heap to /opt/2.hprof ...
Heap dump file created
自动导出
JVM中配置以下参数,当发生OOM时,将导出应用程序的当前堆快照。
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/opt/3.hprof
2)显示堆内存相关信息
jmap -heap
[root@bogon ~]# jmap -heap 12023
Attaching to process ID 12023, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.144-b01
using thread-local object allocation.
Mark Sweep Compact GC
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 90
MaxHeapSize = 8388608 (8.0MB)
NewSize = 2752512 (2.625MB)
MaxNewSize = 2752512 (2.625MB)
OldSize = 5636096 (5.375MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
New Generation (Eden + 1 Survivor Space):
capacity = 2490368 (2.375MB)
used = 0 (0.0MB)
free = 2490368 (2.375MB)
0.0% used
Eden Space:
capacity = 2228224 (2.125MB)
used = 0 (0.0MB)
free = 2228224 (2.125MB)
0.0% used
From Space:
capacity = 262144 (0.25MB)
used = 0 (0.0MB)
free = 262144 (0.25MB)
0.0% used
To Space:
capacity = 262144 (0.25MB)
used = 0 (0.0MB)
free = 262144 (0.25MB)
0.0% used
tenured generation:
capacity = 5636096 (5.375MB)
used = 283800 (0.27065277099609375MB)
free = 5352296 (5.104347229003906MB)
5.035400390625% used
749 interned Strings occupying 50616 bytes.
jmap -histo
jmap -histo 12023
由于jmap将访问堆中的所有对象,为了保证在此过程中不被应用线程干扰,jmap需要借助安全点机制,让所有线程停留在不改变堆中数据的状态。也就是说,由jmap导出的堆快照必定是安全点位置的。这可能导致基于该对快照的分析结果存在偏差。
例如:假设在编译生成的机器码中,某些堆对象的生命周期在两个安全点之间,那么:live选项将无法探知到这些对象。
另外,如果某个线程长时间无法跑到安全点,jmap将一直等下去。与jstat不同的是,垃圾回收器会主动将jstat所需要的摘要数据保存至固定位置之中,而jstat只需直接读取即可。
3)查看系统的ClassLoader信息
jmap -clstats 14237