1 导出堆
进入cmd 输入jdk的bin目录 输入 jmap -dump:live,file=a.map 2524
a可以是随意起的堆名称 2524 是eclipse.exe进程PID。(可以用jps查询相关java进程)
查看jmap用法,cmd进入bin目录后输入jmap 会有提示,example 有例子。
2 分析堆文件
输入 jhat a.map
jhat内置一个简单的web服务器,此命令执行后,jhat在命令行里显示分析结果的访问地址,可以用-port选项 指定端口
如果想指定内存和端口(dump出来的堆很大,在启动时会报堆空间不足的错误): jhat -J-Xmx512m -port 7200 a.map
如果不指定端口的话 会提示 ...Start Http Server on port 7000,Server is ready
这时可以直接打开浏览器查看
http://localhost:7000/ 这里看到所有的类
进入oql查询界面 http://localhost:7000/oql/
具体OQL用法可见:http://localhost:7000/oqlhelp/
注: 2524 是本地的eclipse.exe的pid
更多jmap
查看更多的JVM内存状态 jmap -histo 2524
导出文件如果写了可以只写名称,这样文件(可以是.map,.txt等)会默认的放到一个位置。也可以指定相应的位置。如:jmap jmap -dump:file=c:\dump.txt 2524
分析也要写全路径 jhat -port 7300 c:\dump.txt
3 简单方式
这样使用oql似乎太麻烦了,jvisualvm 更为方便 点击本地的监视,右侧有一个堆dump,点击进去就可以看到有一个oql的选项,这里可以直接输入oql语句,查询结果也相对好看了很多。
jvisualvm可以指定oql,下次可以直接选之前保存的oql语句,同时也给出了很多的oql样例