java dump文件怎么生成和分析

Python097

java dump文件怎么生成和分析,第1张

jmap是java自带的工具

1. 查看整个JVM内存状态

jmap -heap [pid]

2. 查看JVM堆中对象详细占用情况

jmap -histo [pid]

3. 导出整个JVM 中内存信息,可以利用其它工具打开dump文件分析,例如jdk自带的visualvm工具

jmap -dump:file=文件名.dump [pid]

thread dump解析

头部信息

时间,jvm信息

{code}

2011-11-02 19:05:06

Full thread dump Java HotSpot(TM) Server VM (16.3-b01 mixed mode):

{code}

线程info信息块

{code}

"Checkpointer" daemon prio=10 tid=0x68ce1c00 nid=0x7c11 in Object.wait() [0x68b5c000]

java.lang.Thread.State: WAITING (on object monitor)

at java.lang.Object.wait(Native Method)

- waiting on <0x740ad988>(a java.lang.Object)

at java.lang.Object.wait(Object.java:485)

at com.sleepycat.je.utilint.DaemonThread.run(DaemonThread.java:163)

- locked <0x740ad988>(a java.lang.Object)

at java.lang.Thread.run(Thread.java:619)

{code}

"Checkpointer" daemon prio=10 tid=0x68ce1c00 nid=0x7c11 in Object.wait() [0x68b5c000]

* 线程名称:Checkpointer

* 线程类型:daemon

* 优先级:10,默认是5

* jvm线程id:jvm内部线程的唯一标识,0x68ce1c00

* 对应系统线程id:和top命令查看的pid对应,不过一个是10进制,一个是16进制。0x7c11

* 线程状态:Object.wait().

* 起始栈地址

线程状态详解

Runnable

_The thread is either running or ready to run when it gets its CPU turn._

不解释。

Wait on condition

_The thread is either sleeping or waiting to be notified by another thread._

该状态出现在线程等待某个条件的发生或者sleep。

_最常见的情况是线程在等待网络的读写,比如当网络数据没有准备好读时,线程处于这种等待状态,而一旦有数据准备好读之后,线程会重新激活,读取并处理数据。_

Waiting for Monitor Entry and in Object.wait()

_The thread is waiting to get the lock for an object (some other thread may be holding the lock). This happens if two or more threads try to execute synchronized code. Note that the lock is always for an object and not for individual methods._

当一个线程申请进入临界区时,获取到monitor,线程将处于 “Runnable”的状态,否则,线程 DUMP会显示处于 “waiting for monitor entry”。

当线程获得了 Monitor,进入了临界区之后,如果发现线程继续运行的条件没有满足,它则调用对象(一般就是被 synchronized 的对象)的 wait() 方法,放弃了 Monitor,进入 “Wait Set”队列。只有当别的线程在该对象上调用了 notify() 或者 notifyAll() , “ Wait Set”队列中线程才得到机会去竞争,但是只有一个线程获得对象的 Monitor,恢复到运行态。在 “Wait Set”中的线程, DUMP中表现为: in Object.wait()。

例:

<span style="background-color: rgb(255, 255, 255)"><span style="color:#ff6666">{code}

"Timer-0" daemon prio=10 tid=0x695c3000 nid=0x7c00 in Object.wait() [0x69468000]

java.lang.Thread.State: TIMED_WAITING (on object monitor)

at java.lang.Object.wait(Native Method)

- waiting on <0x744f2850>(a java.util.TaskQueue) ###继续wait

at java.util.TimerThread.mainLoop(Timer.java:509)

- locked <0x744f2850>(a java.util.TaskQueue) ###已经lock到0x744f2850

at java.util.TimerThread.run(Timer.java:462)

{code}</span></span>

参见:http://jameswxx.iteye.com/blog/1041173

{code}

java.lang.Thread.State: WAITING (on object monitor)

<p style="margin-top: 4pxmargin-right: 0pxmargin-bottom: 4pxmargin-left: 0pxpadding-top: 2pxpadding-right: 0pxpadding-bottom: 2pxpadding-left: 0px">{code}</p>

线程状态运行:

WAITING||State || Description||

|blocked|This thread tried to enter a synchronized block, but the lock was taken by another thread. This thread is blocked until the lock gets released.|

|blocked (on thin lock)|This is the same state as blocked, but the lock in question is a thin lock.||waiting|This thread called Object.wait() on an object. The thread will remain there until some other thread sends a notification to that object.|

|sleeping|This thread called java.lang.Thread.sleep().||parked|This thread called java.util.concurrent.locks.LockSupport.park().||suspended|The thread's execution was suspended by java.lang.Thread.suspend() or a JVMTI agent call.|

{code}

at java.lang.Object.wait(Native Method)

- waiting on <0x740ad988>(a java.lang.Object)###等待堆地址为0x740ad988的java.lang.Object对象的锁

at java.lang.Object.wait(Object.java:485)

at com.sleepycat.je.utilint.DaemonThread.run(DaemonThread.java:163)

- locked <0x740ad988>(a java.lang.Object)###hold住堆地址为0x740ad988的java.lang.Object对象的锁

at java.lang.Thread.run(Thread.java:619)

{code}

1.打开/tomcat_home/bin/catalina.bat文件

2.加上:set JAVA_OPTS=%JAVA_OPTS% -server -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\heapdump,这样当内存溢出是就会在对应路径下生成dump文件

运行程序打开jdk bin 文件夹下再带的 jvisualvm.exe

选择tomcat线程,打开实时监控页面可以看到对应的堆栈线程和装在类,内存的实时情况

运行程序打开jdk bin 文件夹下再带的 jconsole.exe,可以概览堆栈线程和装在类,内存的全部运行时间情况

下载安装mat,dump分析软件,安装后,点击file open 导入dump文件

打开后,灰色区域为可能发生内存溢出的区域,下带问题描述

选择Histogram,点击shallow列进行排序,找出实例最多的

右键实例最的选择list objects-with incoming references,可在根据正则表达式输入自己想查的类,搜索,后右键打开 path to gc root-exclude phantom/weak/soft etc. references 就可以查出 调用为回收的相关信息。