内存映像工具jmap
前言
jmap
全称Memory Map For Java
虚拟机统计信息监视工具, 可以生成堆内存的快照, 在事后进行分析.
当然我们还可以给JVM
加上-XX:+HeapDumpOnOutOfMemoryError
, 在内存溢出的时候自动生成堆内存的快照.
命令格式: jmap [option] vmid
参数 | 说明 |
---|---|
vmid |
如果是本地虚拟机, 那就是jps 的进程号. 如果是远程虚拟机, 则应该是[protocol:][//]lvmid[@hostname[:port]/servername] |
选项option
代表要查询的数据
选项 | 作用 |
---|---|
-dump |
生成堆内存快照. 格式为-dump:[live,]format=b,file=/tmp/heap.dump , 其中live 说明是否只dump 存活的对象 |
-finalizerinfo |
显示在F-Queue 中等待Finalizer 线程执行finalize 方法的对象. |
-heap |
显示堆详细信息 |
-histo |
显示堆中对象统计信息 |
-permstat |
以ClassLoader 为统计口径显示永久代内存状态 |
-F |
-dump 没响应的时候, 强制生成dump 快照 |
常用命令
jmap -heap PID
用来查看堆内存, jstat
已有相同的功能了, 并且更全面.jstat
除了堆内存信息, 还有GC
的相关信息.
jmap -histo PID
所以一般jmap
都是用来查看堆内对象的具体内存信息的. 这是jstat
做不到的事情.
1 | num #instances #bytes class name |
从输出信息可以看出byte[]
类型有190803
个实例, 占用63620528
个字节.int[]
类型有33239
个实例, 占用40343096
个字节.char[]
类型有349476
个实例, 占用39534528
个字节.
以此类推
jmap -dump:live,format=b,file=dump.hprof PID
当然生产环境不会给你慢慢的分析, 一般都是输出到文件, 把文件传到本地慢慢分析.
可以用jhat dump.hprof -port 7000
分析, 但一般使用的是MAT
做分析.