dump文件:在故障定位(尤其是out of memory)和性能分析的时候,dump文件记录了JVM运行期间的内存占用、线程执行等情况。
heap dump:记录某一时刻JVM堆中对象使用情况,哪些对象占用了太多的堆栈空间,来发现导致内存泄露或者可能引起内存泄露的对象。
thread dump:记录java应用中各线程在某一时刻的运行的位置,即执行到哪一个类的哪一个方法哪一个行上。
heap dump
获取dump文件jmap获取:
windows下切换到JDK_HOME/bin/,执行以下命令:
jmap -dump:format=b,file=文件名 [pid]
Aix\linux下切换到JDK_HOME/bin/,执行以下命令:
./jmap -dump:format=b,file=文件名 [pid]
这样就会在当前目录下生成dump文件,这就是heap dump文件。
查看整个JVM内存状态
jmap -heap [pid]
要注意的是在使用CMS GC 情况下,jmap -heap的执行有可能会导致JAVA 进程挂起
查看JVM堆中对象详细占用情况
jmap -histo [pid]
导出整个JVM 中内存信息
jmap -dump:format=b,file=文件名 [pid]
使用jvisualvm来分析dump文件:
jvisualvm是JDK自带的Java性能分析工具,在JDK的bin目录下,文件名就叫jvisualvm.exe。
jvisualvm可以监控本地、远程的java进程,实时查看进程的cpu、堆、线程等参数,对java进程生成dump文件,并对dump文件进行分析。
使用方式:直接双击打开jvisualvm.exe,点击文件->装入,在文件类型那一栏选择堆,选择要分析的dump文件,打开。
可以看到,dump文件里记录的堆中的实例,总大小大概300M左右,(用第一行的实例大小除以百分比就能算出来),和JVM默认的新生代的大小差不多,远小于JVM中设置的最大堆内存,也就是说,dump文件里记录的并不是实例大小达到最大堆内存时的状态。
使用JDK自带的jhat命令
jhat是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言。
jhat -port 5000 文件
当服务启动完成后,我们就可以在浏览器中,通过http://localhost:5000/进行访问,如下所示:
eclipse Memory Analyzer分析
Eclipse 提供的一个用于分析JVM 堆Dump文件的插件。借助这个插件可查看对象的内存占用状况,引用关系,分析内存泄露等。
.运行参数配置:Run as–>Run Configurations–>Arguments–>VM arguments:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError,-XX:+HeapDumpOnOutOfMemoryError 配置后,当存溢出就会生成文件。如下图:
获取thread dump文件
Jstack:
windows下执行:jstack [pid]> thread.txt
linux下执行:./jstack [pid] > thread.txt
jstack [-l ] | tee -a jstack.log
执行 jstack [pid] ,线程的所有堆栈信息
“http-8080-10” daemon prio=10 tid=x0a949bb60 nid=0x884 waiting for monitor entry […]
“http-8080-10” 这个线程处于等待状态。 waiting for monitor entry 如果在连续几次输出线程堆栈信息都存在于同一个或多个线程上时,则说明系统中有锁竞争激烈,死锁,或锁饿死的想象。
“http-8080-11” daemon prio=10 tix=xxx nid=xxx in object.wait() […]
java.lang.Thread.State:waiting (on object monitor)
该表示http-8080-11的线程处于对象的Wait 上,等待其他线程的唤醒,这也是线程池的常见用法。
“Low Memory Detector”daemon prio=10 tix=xx nid=xxx runnable […] java.lang.Thread.State:runnable
表示“Low Memory Detector” 的线程处于Runable状态,等待获取CPU的使用权.
Java VisualVM
在jdk1.6 中 Oracle 提供了一个新的可视化的JVM 监控工具 Java VisualVM,在JDK 的 bin 目录下。
双击启动 Java VisualVM 后可以看到窗口左侧 “应用程序 ”栏中有“ 本地 ”、“远程 ” 、“快照 ”三个项目。
“本地 ”下显示的是在 localhost 运行的 Java 程序的资源占用情况,如果本地有 Java 程序在运行的话启动 Java VisualVM 即可看到相应的程序名,点击程序名打开相应的资源监控菜单,以图形的形式列出程序所占用的 CPU 、 Heap 、 PermGen 、类、线程的 统计信息。
服务封装
service.bat里加上-XX:+HeapDumpOnOutOfMemoryError;