官方文档:https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jmap.html
官方文档:https://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/jmap.html
目录
jmap (Memory Map for Java)
- 获取堆转储快照
- 查询
finalize
执行队列 - Java堆和方法区的详细信息,如空间使用率、当前用的是哪种收集器
常见用法
显示Java进程的堆内存详细信息
「自」详情参考 → 如何查看堆内存 → jsp+jmap
jps -l → 19320 com.zhangziwa.practisesvr.model.Main
jmap -heap 301760 // jdk <= 8
jhsdb jmap --heap --pid 301760 // jdk > 8
显示Java进程中堆内存中每个类的对象数和总大小
jps -l → 19320 com.zhangziwa.practisesvr.model.Main
jmap -histo:live 19552 // jdk <= 8
jhsdb jmap --histo --pid 301760 // jdk > 8
jhsdb jmap --histo --pid 301760| findstr str
显示每个Java类对象数量、内存大小(单位:字节)、完全限定的类名。
Iterating over heap. This may take a while...
Heap traversal took 0.614 seconds.
序号 Java类对象数量 内存大小(单位:字节) 完全限定的类名
52: 71 4544 java.util.stream.ReferencePipeline$2
62: 70 3920 java.util.stream.ReferencePipeline$Head
101: 71 1704 java.util.stream.ReferencePipeline$2$1
104: 69 1656 java.util.stream.FindOps$FindSink$OfRef
189: 8 320 java.util.stream.StreamOpFlag$Type[]
200: 7 280 java.util.stream.StreamOpFlag[]
211: 6 240 java.util.stream.StreamOpFlag
261: 2 128 java.util.stream.ReferencePipeline$3
269: 5 120 java.util.stream.StreamOpFlag$Type
287: 4 96 java.util.stream.StreamShape
295: 6 96 java.util.stream.StreamOpFlag$MaskBuilder
显示进程中等待终结的对象信息
jps -l → 19320 com.zhangziwa.practisesvr.model.Main
jhsdb jmap --finalizerinfo --pid 19320
Attaching to process ID 19320, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 17.0.5+9-LTS-191
Number of objects pending for finalization: 0
显示进程中每个类加载器加载的类的数量、内存使用情况等
jps -l → 19320 com.zhangziwa.practisesvr.model.Main
jhsdb jmap --clstats --pid 19320
Attaching to process ID 19320, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 17.0.5+9-LTS-191
finding class loader instances ..done.
computing per loader stat ..done.
please wait.. computing liveness.liveness analysis may be inaccurate ...
class_loader classes bytes parent_loader alive? type
<bootstrap> 2468 7208190 null live <internal>
0x000000070d739f70 1 1722 null dead jdk/internal/reflect/DelegatingClassLoader@0x0000000800009330
0x000000070d830980 1 1130 null dead jdk/internal/reflect/DelegatingClassLoader@0x0000000800009330
0x000000070d707d70 1 1721 null dead jdk/internal/reflect/DelegatingClassLoader@0x0000000800009330
0x000000070e989298 1 1721 null dead jdk/internal/reflect/DelegatingClassLoader@0x0000000800009330
将参数直接传给JVM实例,调整JVM行为或配置时非常有用
jps -l → 19320 com.zhangziwa.practisesvr.model.Main
jhsdb jmap -J-Xmx512m -J-XX:+PrintGCDetails --heap --pid 19320
字段详情:jhsdb jmap -J-Xmx512m -J-XX:+PrintGCDetails --heap --pid 19320
生成堆转储快照dump文件
1、-XX:+HeapDumpOnOutOfMemoryError
:可让JVM在OOM
时自动生成堆转储快照文件。
2、-XX:+HeapDumpOnCtrlBreak
:可使用[Ctrl]+[Break]
键让虚拟机生成堆转储快照文件。
3、Linux系统下通过Kill-3
命令发送进程退出信号“恐吓”一下虚拟机,也能顺利拿到堆转储快照。
4、使用jmap命令直接生成堆转储快照文件。
jmap -dump:format=b,file=heapdump.phrof 19552 # jdk <= 8
jmap -histo:live,file=/tmp/histo.data 301760 # jdk > 8
Heap inspection file created: D:\tmp\histo.data # 注意不会创建文件夹,如果不存在文件夹则不会生成histo.data
-----------------------------------------------------------------------------读书笔记摘自 书名:深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)作者:周志明