最近被java内存溢出搞的烦躁不堪,所以专门抽空研究了一下JavaCore/HeapDump文件及其分析方法
文件产生的时间
Java程序运行时,有时会产生JavaCore及HeapDump文件,它一般发生于Java程序遇到致命问题的情况下。
- 有时致命问题发生后,Java应用不会死掉,还能继续运行;
- 但有时致命问题发生,Java进程会死掉;
为了能够保留Java应用发生致命错误前的运行状态,JVM在死掉前产生两个文件,分别为JavaCore及HeapDump文件。
有何区别
JavaCore是关于CPU的,而HeapDump文件是关于内存的。
- JavaCore文件主要保存的是Java应用各线程在某一时刻的运行的位置,即JVM执行到哪一个类、哪一个方法、哪一个行上。它是一个文本文件,打开后可以看到每一个线程的执行栈,以stack trace的显示。通过对JavaCore文件的分析可以得到应用是否“卡”在某一点上,即在某一点运行的时间太长,例如数据库查询,长期得不到响应,最终导致系统崩溃等情况。
- HeapDump文件是一个二进制文件,它保存了某一时刻JVM堆中对象使用情况,这种文件需要相应的工具进行分析,如IBM Heap Analyzer这类工具。这类文件最重要的作用就是分析系统中是否存在内存溢出的情况。
文件时如何生成
这两个文件可以用手工的方式生成,当我们会遇到系统变慢或无响应的情况,这时就以采用手工的方式生成JavaCore及HeapDump文件。
在Unix/Linux上,产生这两个文件的方法如下:
# ps -ef | grep java
user 4616 4582 0 17:30 pts/0 00:00:00 grep java
root 5580 1 0 Oct27 ? 00:02:27 /usr/bin/java -server -XX:PermSize=64M -XX:MaxPermSize=128m-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=/usr/local/tomcat8090/conf/logging.properties-Djava.endorsed.dirs=/usr/local/tomcat8090/endorsed -classpath :/usr/local/tomcat8090/bin/bootstrap.jar -Dcatalina.base=/usr/local/tomcat8090-Dcatalina.home=/usr/local/tomcat8090 -Djava.io.tmpdir=/usr/local/tomcat8090/temp org.apache.catalina.startup.Bootstrap start
# kill -3 5580
首先,找出Java进程id ,然后再执行‘kill -3 进程号’的操作,等文件生成后再做一次同样的操作,再产生一组文件。
如何分析
JavaCore文件
两组文件在分析JavaCore时特别有效,因为它可以看出在先后两个时间点上,线程执行的位置,如果发现先后两组数据中同一线程都执行在同一位置,则说明此处可能有问题,因为程序运行是极快的,如果两次均在某一点上,说明这一点耗时是很大的,通过对这两个文件进行分析,查出原因,进而解决问题。
JavaCore文件的头部有一个“Current Thread Details”标记,它记录了JavaCore产生时系统运行的线程id,使用线程id在文件中查找线程的详细信息,该信息中记载了线程运行哪个类的时候造成的JavaCore。
NULL ------------------------------------------------------------------------
0SECTION TITLE subcomponent dump routine
NULL ===============================
1TISIGINFOOUTOFMEMORY received
1TIDATETIME Date: 2011/12/07 at 15:59:42
1TIFILENAME Javacore filename:/usr/WebSphere/AppServer/profiles/WCSProdNode2/javacore19202086.1323298782.txt
NULL ------------------------------------------------------------------------
0SECTION XHPI subcomponent dump routine
NULL ==============================
1XHTIME Wed Dec 7 15:59:42 2011
1XHSIGRECV Unexpected signal -1 received at 0x0 in <unknown>. Processing terminated.
1XHFULLVERSION J2RE 1.4.2 IBM AIX build ca142ifx-20090918 (SR13 FP2)
NULL
1XHCURRENTTHD Current Thread Details
NULL ----------------------
2XHCURRSYSTHD "WebContainer : 5" sys_thread_t:0x45FB5328
3XHNATIVESTACK Native Stack
NULL ------------
3XHSTACKLINEERR unavailable - stack address not valid
:::
:::
0SECTION XM subcomponent dump routine
NULL ============================
NULL
1XMCURTHDINFO Current Thread Details
NULL ----------------------
3XMTHREADINFO "WebContainer : 5" (TID:0x70A8E260, sys_thread_t:0x45FB5328, state:R, native ID:0x5CC0) prio=5
4XESTACKTRACE at org.apache.taglibs.standard.tag.common.core.ImportSupport$ImportResponseWrapper.getString(Unknown Source)
4XESTACKTRACE at org.apache.taglibs.standard.tag.common.core.ImportSupport.acquireString(Unknown Source)
4XESTACKTRACE at org.apache.taglibs.standard.tag.common.core.ImportSupport.doEndTag(Unknown Source)
4XESTACKTRACE at com.ibm._jsp._part._jspx_meth_c_import_3(_part.java(Compiled Code))
4XESTACKTRACE at com.ibm._jsp._part._jspx_meth_c_otherwise_3(_part.java(Compiled Code))
4XESTACKTRACE at com.ibm._jsp._part._jspx_meth_c_choose_4(_part.java(Compiled Code))
4XESTACKTRACE at com.ibm._jsp._part._jspService(_part.java:3237)
这样结合当时的日志文件可以找到问题产生的原因。不过,这种方法只能找到不是内存溢出的错误,对于在core文件头就有java/lang/outMemoryException的错误还是不知道是执行到哪个类的时候出现。
HeapDump文件
HeapDump文件是指定时刻的Java堆栈的快照,是一种镜像文件。Heap Analyzer工具通过分析HeapDump文件,哪些对象占用了太多的堆栈空间,来发现导致内存泄露或者可能引起内存泄露的对象。
分享到:
相关推荐
javacore 文件及 heapdump 文件分析 javacore 文件和 heapdump 文件是 Java 应用程序在遇到致命问题时产生的两个文件,这两个文件可以帮助我们分析和解决 Java 应用程序中的问题。 javacore 文件是一个文本文件,...
本篇文章将详细讲解如何使用`javacore`和`heapdump`分析工具,特别是针对Websphere环境的`ha`和`jca`工具,以及如何使用JDK1.6来打开和解析这些文件。 首先,`javacore`文件是Java虚拟机(JVM)在遇到特定事件(如...
1. 使用分析工具打开HeapDump文件,查看总体内存占用情况,识别占用内存最多的类和实例。 2. 分析大对象,检查是否有内存泄漏的迹象,如长生命周期的临时对象或者不再使用的对象占用大量内存。 3. 查看类加载器信息...
javacore.txt文件用jca打开,heapdump.phd文件用ha打开。 Heap dump 文件是一个二进制文件,它保存了某一时刻在 Java 堆中所有对象的状态。这个文件最重要的作用就是分析 Java 堆内存泄露问题,heap analyzer,MAT ...
利用`kill -3 appserver_pid`命令,可以在设定的目录下生成Heapdump和JavaCore文件。这里`appserver_pid`为应用服务器的进程ID,通常可以从`$AppServer_installDir/profiles/$AppSrv_name/logs/$server_name`目录下...
5. **分析文件**:生成的javacore和heapdump文件可以用专门的分析工具打开,如IBM Heap Analysis Tool (HAT),Eclipse Memory Analyzer (MAT)等,它们能提供可视化的分析结果,帮助找出问题。 6. **注意问题**:在...
Java Core-HeapDump 文件是 Java 应用程序在发生致命问题的情况下产生的两个文件,它们分别是 JavaCore 文件和 HeapDump 文件。这些文件能够帮助开发者保留 Java 应用程序发生致命错误前的运行状态,从而帮助开发者...
JCA工具专门设计用于解析和分析javacore和heapdump文件,如IBM的VisualVM、Eclipse Memory Analyzer (MAT)、YourKit Java Profiler等。这些工具提供图形化的界面,使得分析过程更为直观。例如,MAT能帮助用户找到...
分析javacore文件,我们可以查看以下关键点: 1. **线程状态**:了解哪些线程处于运行、等待、阻塞或死锁状态。 2. **堆内存**:查看内存分配和使用情况,检查是否有内存泄漏。 3. **类加载信息**:监控类的加载、...
Java内存dump分析和Thread Dump(Java Core)是Java性能调优中的重要环节,它们能帮助开发者定位和解决系统中的各种问题,如内存泄漏、线程阻塞等。下面将详细介绍这两个概念及其分析工具。 首先,Java堆内存dump,...
1,IBM的HeapAnalyzer工具。在我们的应用程序发生内存泄露的时候,会生成heapdump文件 2,IBM的Thread and Monitor Dump Analyzer for Java工具 ...在生成heapdump文件的时候,一般会生成javacore文件。
与HeapDump文件不同,JavaCore文件侧重于CPU的活动,而HeapDump文件则关注内存的使用情况。 JavaCore文件通常在以下两种情况下产生: 1. 当Java程序遇到致命错误但仍然可以继续运行时。 2. 当Java进程因严重问题而...
分析javacore文件有助于我们诊断和解决Java应用的性能问题,比如死锁、内存泄漏或线程阻塞。利用专门的工具,如JConsole、VisualVM或Eclipse MAT,可以将这些复杂的数据转化为可视化图表,更直观地理解问题所在。 ...
2. **解析javacore**:IBM提供了专门的工具,如`IBM Heap Analyzer`,它可以解析javacore文件,显示当前活动线程的状态,包括阻塞、等待、运行等,以及线程的调用堆栈,帮助我们定位可能的死锁或资源竞争问题。...
此外,`javacore`和`heapdump`工具也是常用的WebSphere dump分析助手,它们提供了关于JVM内存和线程状态的详细信息。 对于z/OS这样的大型主机操作系统,IBM提供了Tivoli OMEGAMON工具集,其中的OMEGAMON XE for ...
分析javacore文件可以帮助我们了解应用程序在出现问题时的运行情况,找出可能的内存泄漏或过度占用资源的线程。 `deapdump`(也称为`thread dump`或`heap dump`)是另一种重要的诊断工具,它提供了更深入的内存分析...
2. 其次,使用heapdump文件分析内存占用情况,查找内存泄漏的线索,例如持续增长的对象或异常大的对象实例。 3. 对比不同时刻的javacore和heapdump文件,寻找线程执行位置和内存状态的差异,以确定问题的动态变化。 ...
#### Heapdump文件分析 ##### 文件生成 Heapdump文件是在Java应用遭遇OOM时自动生成的一种二进制文件,它包含了JVM堆中的对象状态。同样,可以在系统变慢时手动生成。需要注意的是,避免在系统启动初期生成这些...
分析JavaCore文件主要涉及以下几个方面: 1. **内存分配与使用情况**:查看各内存区域(如新生代、老年代、永久代)的大小、已用空间和剩余空间,以及对象分配的情况,这有助于识别内存泄漏或过度分配。 2. **对象...
使用这两个工具时,通常的步骤是先通过JVM的故障处理工具生成javacore和heapdump文件,然后分别导入到HeapAnalyzer和PMA进行分析。对于大型复杂系统,定期进行这样的分析并及时修复内存泄漏至关重要,可以显著提高...