简述
命令jmap是一个多功能的命令。它可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。
实战
笔者开发环境
Macos(unix)
jdk:1.8
ide:IDEA
jvm configuration:-Xms20m -Xmx20m -XX:NewSize=8m -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
在笔者zsh终端输入jmap,或者在linux和windows命令行输入jmap,将显示以上option介绍
大概简述一下就是提供有各种option去实现各种功能,pid就是应用运行的进程id
常用的大概就是heap hist:live dump clstats这几个option了
举个栗子
笔者写了个Hello.java
然后运行main方法。
首先是通过jps找到这个运行类的pid,jps也可以加option,可以显示具体类名等信息,这种方式只支持当前用户应用,也就是在unix权限里如果是别人的应用,你就老老实实用pgrep之类的吧,反正我都告诉你了。
ok,找到了pid,下面来看看jmap能够做什么
heap
如上图,heap能够打印出jvm一些配置信息,如笔者这次运行的环境,就是Parnew+CMS收集器,然后堆是20M
New Generation和Old Generation分别是8M和12M,并且能够看出以上是新生代分为eden区和两个survivor区(from to),那么老年代使用的是mark sweep标记清除算法。然后还可以看到一些基础配置(Heap configuration),比如新老晋升阀值,新老比例,G1回收器单个region大小等。并且每个区域使用内存情况也有显示。
histo:live
还是刚才那个demo,笔者手残停止了应用,重新来一次,换了个1080pid。
可以看到histo:live打印的是存活状态对象的内存占用情况。
一般来说有经验的调优者在遇到OOM的时候,可以从histo这里看到是否有明显的hashtable过多之类的代码问题。
clstats
这个就是类加载的信息展示了,像什么ApplicationClassLoader和ExtClassLoader,分别是应用层和第三方加载器,这个大家自己去深入理解java虚拟机里面具体学习了,不多介绍了,我这个样例没有准备解释BootStrap双亲委派 自定义加载等demo。
dump
命令:jmap -dump:format=b,file=heapdump.phrof pid
描述:生成堆转储快照dump文件。
dump就会生成到显示的目录里了。
网友评论