一.dump基本概念
在故障定位(尤其是out of memory)和性能分析的时候,经常会用到一些文件来帮助我们排除代码问题。这些文件记录了JVM运行期间的内存占用、线程执行等情况,这就是我们常说的dump文件。常用的有heap dump和thread dump(也叫javacore,或java dump)。我们可以这么理解:heap dump记录内存信息的,thread dump是记录CPU信息的。
heap dump:
heap dump文件是一个二进制文件,它保存了某一时刻JVM堆中对象使用情况。HeapDump文件是指定时刻的Java堆栈的快照,是一种镜像文件。Heap Analyzer工具通过分析HeapDump文件,哪些对象占用了太多的堆栈空间,来发现导致内存泄露或者可能引起内存泄露的对象。
thread dump:
thread dump文件主要保存的是java应用中各线程在某一时刻的运行的位置,即执行到哪一个类的哪一个方法哪一个行上。thread dump是一个文本文件,打开后可以看到每一个线程的执行栈,以stacktrace的方式显示。通过对thread dump的分析可以得到应用是否“卡”在某一点上,即在某一点运行的时间太长,如数据库查询,长期得不到响应,最终导致系统崩溃。单个的thread dump文件一般来说是没有什么用处的,因为它只是记录了某一个绝对时间点的情况。比较有用的是,线程在一个时间段内的执行情况。
两个thread dump文件在分析时特别有效,困为它可以看出在先后两个时间点上,线程执行的位置,如果发现先后两组数据中同一线程都执行在同一位置,则说明此处可能有问题,因为程序运行是极快的,如果两次均在某一点上,说明这一点的耗时是很大的。通过对这两个文件进行分析,查出原因,进而解决问题。
二.利用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分析工具,能够帮我们快速定位内存泄露问题。
相关推荐
包括 堆内存dump分析工具和thread dump(java core)的分析工具 还包括两篇关于dump分析的文档,分析java系统内存泄露死循环等非常需要啊有木有
java程序性能分析thread dump和heap dump,dump文件:在故障定位(尤其是out of memory)和性能分析的时候,dump文件记录了JVM运行期间的内存占用、线程执行等情况。 heap dump:记录某一时刻JVM堆中对象使用情况,哪些...
Java Thread Dump Analyzing
在一些平台上,在有些情况下,javacore也被称为javadump,它包含jvm和应用程序相关的在特定时刻的一些诊断信息,如操作系统,应用程序环境,线程,native stack本地堆,锁,和内存的信息。在生成heapdump文件的时候...
介绍了heap dump和thread dump,以及详细介绍dump工具Memory Analyzer的使用,最后讲解了Java对象的内存布局。
JStack和Java Thread Dumps分析
java排障工具集,包括pstools、分析heapDump和分析ThreadDump
gc日志分析工具/heapDump日志分析工具/javaCore日志分析工具
支持 heapdump、threaddump 和内存信息。 堆转储被上传到 Amazon S3。 此应用程序还捆绑了用于通过 ssh 命令行访问部署容器。 支持使用 Tomcat 作为部署容器的 java-buildpack 应用程序。 此应用程序旨在添加到 ...
这里说的数据包括:运行日志、异常堆栈、GC日志、线程快照文件(threaddump/javacore文件)、堆转储快照(heapdump/hprof文件)等。使用JVM命令和一查看这个JVM参数,帮助我们排查、解决问题。 1 JDK的命令行工具 ...
Review of General Memory Concepts: Java Heap, Native Memory, and Memory Leaks Investigating Java Heap Out of Memory Errors Review Garbage Collection and Object References Symptoms, Causes, and ...
功能说明一键式收集Java进程的问题定位信息,包括:Thread Stack和Heap Dump等。监控Java进程使用的CPU,当占用率过高时,自动收集Top信息和Thread Stack。启动、停止、查询、导出飞行记录。使用方法将工具上传到...
VisualVM可以做的:监控应用程序的性能和内存占用情况、监控应用程序的线程、进行线程转储(Thread Dump)或堆转储(Heap Dump)、跟踪内存泄漏、监控垃圾回收器、执行内存和CPU分析,保存快照以便脱机分析应用程序;...
java堆(Java Heap) 51 方法区 51 【JVM】JVM内存结构,GC垃圾收集解析 52 【JVM】双亲委派模型中,从顶层到底层,都是哪些类加载器,分别加载哪些类? 55 【JVM】能不能自己写个类叫java.lang.System? 57 【JVM】...
该资源包含了两部分内容,jca和ha。jca是java线程堆栈分析工具,此压缩包包含的版本是jca396.jar,ha是java内存使用情况分析工具,此压缩包包含的版本是ha405.jar
jcmd <PID> GC.heap_dump <PATH>-堆转储到指定文件 jcmd <PID> Thread.print-线程转储 jcmd 帮助-可用命令列表 jmap -histo-直方图 jmap -dump:活动,文件= <PATH> <PID>-堆转储 ps -eLf-具有其线程的进程列表 kill...
19.12 The HEAPSIZE Statement 19.13 The PROTMODE Statement 19.14 The OLD Statement 19.15 The REALMODE Statement 19.16 The EXETYPE Statement Chapter 20 Creating Dual-Mode Programs with BIND 20.1 ...
5.4 Stopping and starting multi-thread programs . . . . . . . . . . . . . 6 Examining the Stack . . . . . . . . . . . . . . . . . . . . . . 51 6.1 6.2 6.3 6.4 6.5 6.6 7 Stack frames . . . . . . . . . ...
C标准库源代码\HEAPDUMP.C C 标准库源代码\HEAPGROW.C C标准库源代码\HEAPHOOK.C C标准库源代码\HEAPINIT.C C标准库源代码\HEAPMIN.C C标准库源代码\HEAPPRM.C C标准库源代码\HEAPSRCH.C C标准库源代码\HEAPUSED.C C...