java程序性能分析之thread dump和heap dump

一.dump基本概念html

        在故障定位(尤为是out of memory)和性能分析的时候,常常会用到一些文件来帮助咱们排除代码问题。这些文件记录了JVM运行期间的内存占用、线程执行等状况,这就是咱们常说的dump文件。经常使用的有heap dump和thread dump(也叫javacore,或java dump)。咱们能够这么理解:heap dump记录内存信息的,thread dump是记录CPU信息的。java

        heap dump:linux

        heap dump文件是一个二进制文件,它保存了某一时刻JVM堆中对象使用状况。HeapDump文件是指定时刻的Java堆栈的快照,是一种镜像文件。Heap Analyzer工具经过分析HeapDump文件,哪些对象占用了太多的堆栈空间,来发现致使内存泄露或者可能引发内存泄露的对象。数据库

        thread dump:windows

        thread dump文件主要保存的是java应用中各线程在某一时刻的运行的位置,即执行到哪个类的哪个方法哪个行上。thread dump是一个文本文件,打开后能够看到每个线程的执行栈,以stacktrace的方式显示。经过对thread dump的分析能够获得应用是否“卡”在某一点上,即在某一点运行的时间太长,如数据库查询,长期得不到响应,最终致使系统崩溃。单个的thread dump文件通常来讲是没有什么用处的,由于它只是记录了某一个绝对时间点的状况。比较有用的是,线程在一个时间段内的执行状况。浏览器

两个thread dump文件在分析时特别有效,困为它能够看出在前后两个时间点上,线程执行的位置,若是发现前后两组数据中同一线程都执行在同一位置,则说明此处可能有问题,由于程序运行是极快的,若是两次均在某一点上,说明这一点的耗时是很大的。经过对这两个文件进行分析,查出缘由,进而解决问题。eclipse

 

二.利用JDK自带的工具获取thread dump文件和heap dump文件工具

        使用的JDK工具在JDK_HOME/bin/目录下,使用到jmap和jstack这两个命令。性能

1.获取heap dump文件线程

        windows下切换到JDK_HOME/bin/,执行如下命令:jmap -dump:format=b,file=heap.hprof 2576 

        linux下切换到JDK_HOME/bin/,执行如下命令:./jmap -dump:format=b,file=heap.hprof 2576

        这样就会在当前目录下生成heap.hprof文件,这就是heap dump文件。

2.获取thread dump文件

        windows下执行:jstack 2576 > thread.txt

        linux下执行:./jstack 2576 > thread.txt

        windows/linux则会将命令执行结果转储到thread.txt,这就是thread dump文件。有了dump文件后,咱们就能借助性能分析工具获取dump文件中的信息。

3.若是咱们只须要将dump中存活的对象导出,那么可使用:live参数

jmap -dump:live,format=b,file=heapLive.hprof 2576   

        执行完后,咱们在当前目录C:\Java\jdk1.6.0_27\bin下看到刚生成的三个文件,以下所示:


        说明:如上实例的2576是我当前须要分析的java进程PID,关于Windows下如何得到指定的JAVA时空程PID可参考:http://bijian1013.iteye.com/blog/2221238

 

三.使用工具分析java heap dump文件

        如今咱们使用一些图形化工具,来帮助咱们分析文件中的信息,有效地定位问题。

1.使用JDK自带的jhat命令

        jhat是用来分析java堆的命令,能够将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言。

jhat -port 5000 heap.hrof

        当服务启动完成后,咱们就能够在浏览器中,经过http://localhost:5000/进行访问,以下所示:


2.使用eclipse MAT工具

        通常来讲,应用程序的dump文件都是很大的,jdk自带命令难以分析这些大文件。在实际的生产环境下,咱们必需要借助第三方工具,才能快速打开这些大文件,进行分析定位。eclipse memory analyzer是一款优秀的heap分析工具,可以帮咱们快速定位内存泄露问题。

相关文章
相关标签/搜索