使用jmap命令(用于输出对象,适用于解决对象内存溢出等问题)导出内存映象文件与堆内存异常分析 MAT

内存溢出自动导出参数:

//发生溢出时dump出来 
-XX:+HeapDumpOnOutOfMemoryError
//dump的路径 ./为项目启动根路径 
-XX:HeapDumpPath=./

内存溢出手动导出参数:jmap命令使用

jdk安装后会自带一些小工具,jmap命令(Java Memory Map)是其中之一。主要用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节。

jmap命令可以获得运行中的jvm的堆的快照,从而可以离线分析堆,以检查内存泄漏,检查一些严重影响性能的大对象的创建,检查系统中什么对象最多,各种对象所占内存的大小等等。可以使用jmap生成Heap Dump。

关于jamp的命令jdk的官方上很详细,不赘述了。

注意:jmap的dump 将内存使用的详细情况输出到文件

jmap -dump:live,format=b,file=heap.bin pid //说明:内存信息dump到a.log文件中

这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用

通常做法是:

1)首先配置JVM启动参数,让JVM在遇到OutOfMemoryError时自动生成Dump文件

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path

2)然后使用命令

jmap  -dump:format=b,file=/path/heap.bin 进程ID  

如果只dump heap中的存活对象,则加上选项-live。 

 3)然后使用MAT分析工具,如jhat命令,eclipse的mat插件

最后在eclipse中安装MAT插件(http://www.eclipse.org/mat/),
然后在eclipse中,file---->open,打开这个文件heap.bin,利用现成的OOM工具进行分析。
具体操作方法:
首先输入网址http://www.eclipse.org/mat/previousReleases.php,然后查看你自己的Eclipse版本,
我的是Indigo的,
所以点击链接“Previous Releases”,选择Indigo版本的URLhttp://download.eclipse.org/mat/1.1.0/update-site/ 

 用jhat命令可以参看 jhat -port 5000 heapDump 在浏览器中访问:http://localhost:5000/ 查看详细信息

 

你可能感兴趣的:(性能调优实战,内存映象文件,内存异常分析,MAT,jmap)