使用JDK命令 jmap 生成堆快照

jmapJDK 自带的内存分析工具, 它可以查看堆内对象示例的统计信息,也可以可以生成 java 程序的 dump 文件,可以查看 ClassLoader 的信息以及 finalizer队列。
使用JDK命令 jmap 生成堆快照
jmap是一个命令行工具,运行该命令生成的文件可以使用jhatJava VisualVMEclipse MAT等工具进行分析。
使用JDK命令 jmap 生成堆快照

jmap <pid>查看进程的内存映像信息

jmap <pid>

使用JDK命令 jmap 生成堆快照
在没有添加任何选项的情况下 jmap 会打印出指定进程当前运行过程中的内存映像信息。打印的内容包括每个共享对象的起始地址,映射大小已经共享文件对象的路径全称。这与 Solaris 的 pmap 工具比较相似。

jmap -heap <pid> 显示 Java 堆详细信息

jmap -heap 1556

使用JDK命令 jmap 生成堆快照
jmap -heap <pid>可以打印一个堆的摘要信息,包括使用的GC算法,堆配置信息和个内存区域内存使用信息。

jmap -histo:live <pid> 显示堆中对象的统计信息

jmap -histo:live <pid>

使用JDK命令 jmap 生成堆快照
jmap -histo:live <pid> 可以显示堆中各个类的统计信息,包括每个 Java 类、对象数量、内存大小(单位:字节)、完全限定的类名。如果是虚拟内部类,则打印的类名称将会带有一个*前缀。如果指定了live子选项,则只计算活动的对象。

jmap -clstats <pid>打印类加载器信息

jmap -clstats <pid>

使用JDK命令 jmap 生成堆快照

-clstats-permstat的替代方案,在JDK8之前,-permstat用来打印类加载器的数据
打印Java堆内存的永久保存区域的类加载器的智能统计信息。对于每个类加载器而言,它的名称、活跃度、地址、父类加载器、它所加载的类的数量和大小都会被打印。此外,包含的字符串数量和大小也会被打印。

jmap -finalizerinfo <pid>打印等待终结的对象信息

jmap -finalizerinfo <pid>

使用JDK命令 jmap 生成堆快照

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

使用JDK命令 jmap 生成堆快照
hprof二进制格式转储Java堆到指定filename的文件中。live子选项是可选的。如果指定了live子选项,堆中只有活动的对象会被转储。想要浏览heap dump,你可以使用jhat(Java堆分析工具)读取生成的文件。

# 我们在上一步生成了 heapdump.hprof 文件,这里我们制定该文件
jhat heapdump.hprof

使用JDK命令 jmap 生成堆快照
浏览器访问localhost:7000即可看到heapdump.hprof堆的详细信息了。

jmap -dump <pid>命令在执行过程中会目标Java进程会停止对外服务,效果等同FullGC因此在生产环境下慎用
使用JDK命令 jmap 生成堆快照

参考资料

使用JMAP dump及分析dump文件

上一篇:在vscode中点击open with live server 弹出http://127.0.0.1:5500/src/index.html 找不到应用程序


下一篇:财报前瞻|市值翻倍超500亿美元,腾讯音乐明天发财报将带来哪些惊喜?