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因此在生产环境下慎用
本文介绍了JDK内置的内存分析工具jmap,包括其基本用法、不同命令的用途(如查看堆内存、类加载器信息、finalizer队列和堆转储),以及如何配合jhat、JavaVisualVM等工具进行深入分析。特别强调了生产环境中的注意事项。

1008

被折叠的 条评论
为什么被折叠?



