JVM命令行监控工具之jmap(JVM Memory Map)

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

在这里插入图片描述

4)查看堆积在finalizer队列中的对象

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/fengsheng5210/article/details/123666894