JVM命令行监控工具之jmap(JVM Memory Map)
jmap简介
jmap(JVM Memory Map)一方面可以获取dump文件(堆转储快照文件,二进制文件),它还可以获取目标Java进程的内存相关信息,包括Java堆各区域的使用情况、堆中对象的统计信息、类加载信息等。
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