jmap(Memory Map for Java)Java内存映像工具

这篇文章详细介绍了Java内存映像工具jmap的功能,包括获取堆转储快照、查询垃圾回收器信息、对象统计和堆内存使用情况,以及如何生成堆转储文件。主要讨论了JDK8及以后版本的差异和使用方法。

官方文档: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)

  1. 获取堆转储快照
  2. 查询finalize执行队列
  3. Java堆和方法区的详细信息,如空间使用率、当前用的是哪种收集器
    在这里插入图片描述

常见用法

显示Java进程的堆内存详细信息

「自」详情参考 → 如何查看堆内存 → jsp+jmap

jps -l19320 com.zhangziwa.practisesvr.model.Main
jmap -heap 301760                  // jdk <= 8
jhsdb jmap --heap --pid 301760     // jdk > 8

显示Java进程中堆内存中每个类的对象数和总大小

jps -l19320 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 -l19320 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 -l19320 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 -l19320 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版)作者:周志明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值