本文适用于IBM JDK
一、HEAPDUMP文件分析
使用IBM heapAnalyzer工具分析heap dump文件步骤:
1.如何产生java heap dump
当JVM中对象过多,java堆(java heap)耗尽时,就会产生java heap dump文件。另外,可以使用工具或命令显示地产生该文件。在命令行中程序执行过程中按ctrl+break可以产生,使用工具如,IBM HeapAnalyzer,Sap Memory Analyzer以及eclipse memory
analyzer都可以在指定状态产生dump文件。
2.如何分析java
heap dump文件
使用如java
–Xmx800m –jar ha395.jar启动工具,如果启动过程中发现控制台有java.lang.OutOfMemoryError出现,可以适当加大上面的数字(800),给予更多的空间。
然后“Open”产生的dump文件,打开画面如下,文件很大的话需要等待一段时间
ibm heapAnalyzer工具在打开时已经进行了基本的分析,上面全部完成后,会出现如下结果:
除了显示概要结果外,还生成了一棵树。这个画面先不要关,直到你不再需要这个dump了。
二、JAVACORE文件分析
1.IBM Thread and Monitor Dump
Analyzer for Java工具
启动工具C:\java\bin\java –Xmx200m –jar jca13.jar
或
java –Xmx500m –jar jca13.jar E:/javacore.20060228.171037.2084.txt output.html
直接生成output.html
2.Javacore文件产生原因
?自动生成
–IBMJVM
?OutOfMemory
?手动生成
–Kill -3
3.Javacore文件格式
–TITLE文件头部分
–GPINFO文件头部分
–ENVINFO文件头部分
–MEMINFO内存管理信息
–LOCKS锁信息
–THREADS线程信息
–CLASSES类信息
TITLE部分
?记录了引起Javadump的基本事件,时间和文件的名字
TITLE
subcomponent dump routine
===============================
Dump
Event "user" (00004000) received
Date: 2011/04/02 at 00:56:01
Javacore
filename:
/soft/bea/user_projects/domains/omega/javacore.20110402.005601.34176.txt
GPINFO部分
?主要显示与操作系统方面有关的信息
0SECTION GPINFO
subcomponent dump routine
NULL ================================
2XHOSLEVEL OS Level : AIX 5.3
2XHCPUS Processors -
3XHCPUARCH Architecture
: ppc64
3XHNUMCPUS How Many
: 24
ENVINFO部分
?显示在JRE级别的信息、应用服务器命令行启动信息及虚拟机的环境变量信息
ENVINFO
subcomponent dump routine
=================================
J2RE
5.0 IBM J9 2.3 AIX ppc64-64 build j9vmap6423-20071007
VM
build 20071004_14218_BHdSMr
JIT
enabled - 20070820_1846ifx1_r8
Running
as a standalone JVM
/usr/java5_64/bin/java
-Xmx3512m -Xms3512m -Xmn2450m -XX:PermSize=128m -Xmxcl25000
Java
Home Dir: /usr/java5_64/jre
Java
DLL Dir: /usr/java5_64/jre/bin
Sys
Classpath:
/usr/java5_64/jre/lib/vm.jar;/usr/java5_64/jre/lib/core.jar;/usr/j
UserArgs:
-Xjcl:jclscar_23
-Dcom.ibm.oti.vm.bootstrap.library.path=/usr/java5_64/jre/bin
-Dsun.boot.library.path=/usr/java5_64/jre/bin
-Djava.library.path=/usr/java5_64/jre/bin:/usr/java5_64/jre/bin:/usr/java
-Djava.home=/usr/java5_64/jre
MEMINFO部分
?显示内存管理分配的信息,包含堆的空闲空间、当前堆的大小、垃圾收集历史
------------------------------------------------------------------------
MEMINFO
subcomponent dump routine
=================================
Bytes
of Heap Space Free: 7902f578
Bytes
of Heap Space Allocated: db800000
Internal
Memory
segment start alloc end type bytes
000000012F2DCCB0
00000001306CB8B0 00000001306DB8A4 00000001306DB8B0 01000040 10000
000000012F2DD7F0
0000000130664FB0 0000000130674FA0 0000000130674FB0 01000040 10000
000000012F2DD130
0000000130674FD0 0000000130684FBC 0000000130684FD0 01000040 10000
<<>>
GC History
00:56:01:541818000 GMT j9mm.65 - LocalGC end: rememberedsetoverflow=0
causedremembereds
00:56:01:510589000 GMT j9mm.64 - LocalGC start: globalcount=1003
scavengecount=3226 wea
00:56:01:510033000 GMT j9mm.63 - Set scavenger backout flag=false
LOCK部分
?显示的与锁有关的信息
----------------------------------------------------------
LOCKS
subcomponent dump routine
===============================
Monitor
pool info:
Current total number of monitors: 2
Monitor
Pool Dump (flat & inflated object-monitors):
sys_mon_t:0x00039B40 infl_mon_t: 0x00039B80:
java/lang/Integer@004B22A0/004B22AC: Flat
locked by "DeadLockThread 1"
(0x41DAB100),
entry count 1
Waiting to enter:
"DeadLockThread 0"
(0x41DAAD00)
sys_mon_t:0x00039B98 infl_mon_t: 0x00039BD8:
java/lang/Integer@004B2290/004B229C: Flat
locked by "DeadLockThread 0"
(0x41DAAD00), entry count 1
Waiting to enter:
"DeadLockThread 1"
(0x41DAB100)
THREADS部分
?显示了所有的Java线程和栈跟踪方面的信息
"Signal Dispatcher" TID:0x41509200,
j9thread_t:0x0003659C, state:R,prio=5
(native
thread ID:5820, native priority:0, native policy:SCHED_OTHER)
at
com/ibm/misc/SignalDispatcher.waitForSignal(Native Method)
at
com/ibm/misc/SignalDispatcher.run(SignalDispatcher.java:84)
在第一行中的属性是线程的名字、线程标识符、JVM数据结构地址、当前状态和Java优先级。
在第二行中的属性是本地操作系统的线程ID、本地操作系统的优先级及本地操作系统调试机制。
?线程的状态可以是以下值:
?R - Runnable –线程在运行状态
?CW - Condition Wait –线程在等待状态,主要有以下原因引起的:
–调用了sleep()。
–线程在IO方面出现了阻塞。
–调用了wait(),在等待通知。
–通过调用join()使两个线程同步。
?MW – waiting for monitor entry线程在等待锁。
?S – Suspended –另一个线程暂停当前线程。
?Z – Zombie –线程被杀掉。
?P – Parked –线程终结但还没有回收。
?B – Blocked –线程阻塞,它在等待获取锁
CLASSES部分
?在类部分包含了类加载的概要信息和加载的类
–Application加载器(sun/misc/Launcher$AppClassLoader),它是extension加载器的子类.
–Extension加载器(sun/misc/Launcher$ExtClassLoader),它是bootstrap加载器的子类。
–Bootstrap加载器,众所周知它是系统加载器。
CLASSES
subcomponent dump routine
=================================
Classloader
summaries
12345678:
1=primordial,2=extension,3=shareable,4=middleware,5=system,6=trusted,7=application,8=delegating
p---st-- Loader *System*(0x50007498)
Number of loaded libraries 12
Number of loaded classes 3675
-x--st-- Loader
sun/misc/Launcher$ExtClassLoader(0x50018598), Parent *none*(0x00000000)
Number of loaded libraries 0
Number of loaded classes 29
-----ta- Loader
sun/misc/Launcher$AppClassLoader(0x500234C0), Parent sun/misc/Launcher$ExtClassLoader(0x50018598)
Number of loaded libraries 3
Number of loaded classes 11051
《------省略n行------》
ClassLoader
loaded classes
Loader *System*(0x50007498)
org/apache/xpath/objects/XStringForFSB(0x3E76F238)
[Ljavax/naming/Binding;(0x3E76FAC0)
《------省略n行------》
org/apache/xpath/functions/Function3Args$Arg2Owner(0x3E770CA0)
Loader
sun/misc/Launcher$AppClassLoader(0x500234C0)
weblogic/j2ee/descriptor/RelationshipsBean(0x38265960)
《------省略n行------》
weblogic/application/descriptor/AbstractMunger$3(0x3827F278)
三、SNAP文件分析
对跟踪文件进行格式化
跟踪格式化器(trace formatter) 是一个可以在任何平台上运行的Java程序,可以对来自任何平台的跟踪文件进行格式化。IBM SDK在core.jar中提供了这个格式化器,它还需要一个称为TraceFormat.dat的文件,其中包含格式化模板。这个文件在jre/lib中。可以用以下命令行启动跟踪格式化器:
java com.ibm.jvm.format.TraceFormat input_file
[output_file]
在这里,com.ibm.jvm.format.TraceFormat是跟踪格式化器类,input_file是要进行格式化的二进制跟踪文件的名称,output_file是可选的输出文件名。如果没有指定输出文件,那么默认的输出文件名是输入文件名加上.fmt。
四、GC日志分析
要产生GC日志需要添加参数 -verbose:gc
1.IBM Pattern Modeling and
Analysis Tool工具
启动工具:E:\>java -Xmx800m -jar ga439.jar
工具截图:
2.JCONSOLE工具
可以通过JDK自带的JCONSOLE图形化工具实时监控GC情况