jmap
是 JDK
自带的内存分析工具, 它可以查看堆内对象示例的统计信息,也可以可以生成 java 程序的 dump 文件,可以查看 ClassLoader
的信息以及 finalizer
队列。jmap
是一个命令行工具,运行该命令生成的文件可以使用jhat
,Java VisualVM
,Eclipse MAT
等工具进行分析。
jmap <pid>
查看进程的内存映像信息
jmap <pid>
在没有添加任何选项的情况下 jmap
会打印出指定进程当前运行过程中的内存映像信息。打印的内容包括每个共享对象的起始地址,映射大小已经共享文件对象的路径全称。这与 Solaris 的 pmap 工具比较相似。
jmap -heap <pid>
显示 Java 堆详细信息
jmap -heap 1556
jmap -heap <pid>
可以打印一个堆的摘要信息,包括使用的GC算法,堆配置信息和个内存区域内存使用信息。
jmap -histo:live <pid>
显示堆中对象的统计信息
jmap -histo:live <pid>
jmap -histo:live <pid>
可以显示堆中各个类的统计信息,包括每个 Java 类、对象数量、内存大小(单位:字节)、完全限定的类名。如果是虚拟内部类,则打印的类名称将会带有一个*
前缀。如果指定了live
子选项,则只计算活动的对象。
jmap -clstats <pid>
打印类加载器信息
jmap -clstats <pid>
-clstats
是-permstat
的替代方案,在JDK8之前,-permstat
用来打印类加载器的数据
打印Java堆内存的永久保存区域的类加载器的智能统计信息。对于每个类加载器而言,它的名称、活跃度、地址、父类加载器、它所加载的类的数量和大小都会被打印。此外,包含的字符串数量和大小也会被打印。
jmap -finalizerinfo <pid>
打印等待终结的对象信息
jmap -finalizerinfo <pid>
Number of objects pending for finalization: 0 说明当前
F-QUEUE
队列中并没有等待Fializer
线程执行final
jmap -dump:<dump-options> <pid>
生成堆转储快照文件
jmap -dump:live,format=b,file=heapdump.hprof 1556
以hprof
二进制格式转储Java
堆到指定filename
的文件中。live
子选项是可选的。如果指定了live
子选项,堆中只有活动的对象会被转储。想要浏览heap dump
,你可以使用jhat
(Java堆分析工具)读取生成的文件。
# 我们在上一步生成了 heapdump.hprof 文件,这里我们制定该文件
jhat heapdump.hprof
浏览器访问localhost:7000
即可看到heapdump.hprof
堆的详细信息了。
jmap -dump <pid>
命令在执行过程中会目标Java进程会停止对外服务,效果等同FullGC
因此在生产环境下慎用