`
victorwmh
  • 浏览: 212931 次
  • 性别: Icon_minigender_1
  • 来自: 宇宙
社区版块
存档分类
最新评论

JAVA程序分析之Thread dump

    博客分类:
  • java
 
阅读更多

 

Thread Dump是一个非常好用的工具,当JAVA应用程序出现资源(CPU)消耗异常时,通过它可以轻松的查找到问题所在。在诊断问题时,Thread Dump包含的信息能使很好的你分析你的程序代码。几乎所有的Java虚拟机都具有thread-dump的能力,能够及时生成程序中所有线程在某一点的状态(Thread Dump)日志。虽然各Java虚拟机输出格式上略有不同,但总体包含以下信息:线程的运行状态、标识和调用堆栈;调用堆栈中包含完整类名和调用的方法。如果可能的话还有源代码的行数。


一、以下为Windows和Linux获取Thread Dump日志的方法:


1、Windows

在执行Java程序的MSDOS窗口中,按Ctrl+break键。Thread Dump日志将直接打印在窗口中。


2、Linux

# kill -3 pid (注:pid可以通过ps -efHl |grep java或top -H命令获取。)


为了反映线程状态的动态变化,需要接连多次做thread dump,每次间隔10-20s。


不同linux环境和执行Java程序的方式,输出日志的地方和方式也可能不同。在IBM的PowerPC小型机上的linux上执行kill -3 pid会在工作目录下产生类似javacore.20100409.161739.7614.0001.txt的文件。而在普通Linux机器上,则日志会输出到控制台。如:Tomcat的Thread Dump会输出到命令行控制台或者logs的catalina.out文件。nohup方式运行jar程序时,Thread Dump日志会输出到执行命令行时所在目录的nohup.out文件。


二、日志说明

 

2012-09-25 10:25:32
Full thread dump Java HotSpot(TM) Server VM (20.8-b03 mixed mode):

"DestroyJavaVM" prio=10 tid=0x8fb96000 nid=0x54d8 waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

"Thread-4" prio=10 tid=0x8fb91800 nid=0x54e9 waiting on condition [0x8f9f6000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at com.nettrace.tool.udp.URLDataSender.run(URLDataSender.java:47)

"Thread-3" prio=10 tid=0x8fb6fc00 nid=0x54e8 waiting on condition [0x8fa47000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at com.nettrace.tool.udp.URLDataSender.run(URLDataSender.java:47)

"Thread-2" prio=10 tid=0x8fb55800 nid=0x54e7 waiting on condition [0x8fa98000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at com.nettrace.tool.udp.URLDataSender.run(URLDataSender.java:47)

"Thread-1" prio=10 tid=0x8fb46000 nid=0x54e4 waiting on condition [0x8fafe000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at com.nettrace.tool.udp.URLDataSender.run(URLDataSender.java:47)

"Thread-0" prio=10 tid=0x8fb4b400 nid=0x54e3 waiting on condition [0x8fc55000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at com.nettrace.tool.udp.URLDataSender.run(URLDataSender.java:47)

"Low Memory Detector" daemon prio=10 tid=0x08191000 nid=0x54e1 runnable [0x00000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread1" daemon prio=10 tid=0x0818f800 nid=0x54e0 waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" daemon prio=10 tid=0x0818bc00 nid=0x54df waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=10 tid=0x0818a400 nid=0x54de runnable [0x00000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=10 tid=0x08172000 nid=0x54dd in Object.wait() [0x901e8000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0xaa0e99c0> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
        - locked <0xaa0e99c0> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)

"Reference Handler" daemon prio=10 tid=0x08170800 nid=0x54dc in Object.wait() [0x90239000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0xaa0e96a8> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:485)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
        - locked <0xaa0e96a8> (a java.lang.ref.Reference$Lock)

"VM Thread" prio=10 tid=0x0816cc00 nid=0x54db runnable 

"GC task thread#0 (ParallelGC)" prio=10 tid=0x080f8400 nid=0x54d9 runnable 

"GC task thread#1 (ParallelGC)" prio=10 tid=0x080f9800 nid=0x54da runnable 

"VM Periodic Task Thread" prio=10 tid=0x08192c00 nid=0x54e2 waiting on condition 

JNI global references: 1446

Heap
 PSYoungGen      total 9408K, used 3769K [0xa98d0000, 0xaa350000, 0xb4170000)
  eden space 8064K, 42% used [0xa98d0000,0xa9c2e680,0xaa0b0000)
  from space 1344K, 23% used [0xaa0b0000,0xaa100070,0xaa200000)
  to   space 1344K, 0% used [0xaa200000,0xaa200000,0xaa350000)
 PSOldGen        total 21568K, used 0K [0x94770000, 0x95c80000, 0xa98d0000)
  object space 21568K, 0% used [0x94770000,0x94770000,0x95c80000)
 PSPermGen       total 16384K, used 4649K [0x90770000, 0x91770000, 0x94770000)
  object space 16384K, 28% used [0x90770000,0x90bfa518,0x91770000)

 

1、每次执行kill -3 pid或Ctrl+break后,日志首先会记录执行的当前时间。

2、nid为十六进制的线程号,如果top –H查找的pid,在日志搜索时需要转换,pid为十进制。

3、线程的状态一般为三类:Runnable(R)当前可以运行的线程;Waiting on monitor(CW)线程主动wait; Waiting for monitor entry(MW)线程等锁(死锁)。

 

一般关注第一和第三种状态的线程,CPU很忙关注状态为runnable的线程,闲则则关注状态为waiting for monitor entry的线程。

 

 

下面给出一个典型的死锁线程(注意STUCK关键字):

 

"[STUCK] ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=10 tid=02fe9a18 nid=35 lwp_id=7518924 runnable [440dd000..440db878] 
at java.net.SocketInputStream.socketRead0(Native Method) 
at java.net.SocketInputStream.read(SocketInputStream.java:134) 
at weblogic.jdbc.oracle.net8.OracleDataProvider.getArrayOfBytesFromSocket(Unknown Source) 
at weblogic.jdbc.oracle.net8.OracleDataProvider.readFirstPacketInBuffer(Unknown Source) 
at weblogic.jdbc.oracle.net8.OracleDataProvider.readPacket(Unknown Source) 
at weblogic.jdbc.oracle.net8.OracleDataProvider.receive(Unknown Source) 
at weblogic.jdbc.oracle.net8.OracleNet8NSPTDAPacket.sendRequest(Unknown Source) 
at weblogic.jdbc.oracle.OracleImplStatement.fetchNext(Unknown Source) 
at weblogic.jdbc.oracle.OracleImplStatement.fetchNext2(Unknown Source) 
at weblogic.jdbc.oracle.OracleImplResultset.fetchAtPosition(Unknown Source) 
at weblogic.jdbc.base.BaseImplResultSet.next(Unknown Source) 
at weblogic.jdbc.base.BaseResultSet.next(Unknown Source) 
- locked <55f25550> (a weblogic.jdbc.oracle.OracleConnection) 
at weblogic.jdbc.wrapper.ResultSet_weblogic_jdbc_base_BaseResultSet.next(Unknown Source) 
at org.hibernate.loader.Loader.doQuery(Loader.java:685) 

 

4、heap含义

    不同的JVM的Heap信息会略不相同,有关JVM可以参看以下博文:

   1、 http://blog.csdn.net/jia20003/article/details/6608622

   2、 http://www.coderli.com/jvm-heap-code-overflow

 

 

三、阅读扩展

 

Lockness Eclipse Plugin - Thread Dump Analyser Thread Dump分析工具。

 

分享到:
评论

相关推荐

    java thread dump 分析

    Java Thread Dump 分析是 Java 应用程序性能优化的重要工具之一。Thread Dump 是 JVM 的一个快照,记录了当前所有线程的状态,包括线程的 ID、名称、状态、锁信息等。通过分析 Thread Dump,可以找到导致 CPU 高的...

    java 内存dump分析和thread dump(java core)分析

    3. **Thread Dump Analyzer**:开源工具,可自动分析Thread Dump,识别出可能的问题模式,如死锁、线程等待等。 4. **Async Debugging in IntelliJ IDEA / Eclipse**:集成开发环境也提供了查看和分析Thread Dump的...

    Java thread dump analyzer (tda)

    Java线程分析工具(TDA)是一款专为Java开发者设计的强大工具,用于解析和理解Java应用程序的线程转储(thread dump)。线程转储是Java虚拟机(JVM)在特定时刻生成的一种快照,其中包含了应用程序中所有活动线程的状态...

    用Java thread dump 去分析程序的问题

    Java线程转储(Thread Dump)是诊断Java应用程序性能问题和异常情况的重要工具。它提供了一个运行中的Java应用中所有线程的快照,详细显示每个线程的状态、堆栈跟踪以及线程名称。线程状态包括RUNNABLE、BLOCKED、...

    java故障排查ThreadDump

    Thread Dump是Java应用程序故障排查的重要工具之一,它不仅能够帮助我们迅速定位问题所在,还能够在一定程度上预测和避免潜在的问题。通过对Thread Dump的有效分析,我们可以更好地理解和优化Java应用的行为,提高...

    JAVA线程dump的分析

    本文中,我们使用SUN的hotspot JVM 5.0_06为例,展示了如何生成和分析JAVA线程dump,帮助开发者诊断和优化JAVA程序。 在JAVA程序中,线程分析是非常重要的,了解当前程序的执行情况,能够帮助开发者诊断问题和性能...

    IBM Thread and Monitor Dump Analyzer for Java

    IBM Thread and Monitor Dump Analyzer for Java 是一款专门针对Java应用程序的诊断工具,主要用于解析和分析Java核心转储(javacore)文件。这类文件通常在Java应用程序遇到问题,如挂起、内存溢出或异常时自动生成...

    java线程分析工具TDA

    TDA(Thread Dump Analyzer)是一款强大的Java线程分析工具,它能够帮助开发者深入理解应用在运行时的线程状态,包括线程的阻塞情况、等待资源、死锁等问题。下面将详细介绍TDA的使用方法、功能以及它如何帮助我们...

    java Thread Dump Lockness检查死锁

    java Thread Dump 其实就是stack trace。 我们平时经常会碰见java异常,并且得到异常的方法用e.printstacktrace 实际上程序正常运行时也是会有stack trace的,只不过平时不显示出来而已。如何能正常及时显示堆栈信息...

    Thread Dump Analyzer

    线程Dump分析器,简称TDA,是一款专业工具,专门设计用于解析和分析Java应用程序的线程转储(Thread Dump)文件。线程转储是在特定时间点应用程序中所有线程的状态快照,它包含了每个线程的详细信息,如线程ID、线程...

    Java线程Dump分析工具jstack解析及使用场景

    当Java程序出现挂起(hung)或者死锁(Deadlock)等问题时,jstack尤为重要。它可以显示出每个线程的堆栈跟踪,揭示出哪些线程正忙于执行任务,哪些线程被阻塞等待资源,以及等待的具体条件是什么。 在dump文件中,...

    tda看ThreadDump文件

    - **功能**:tda是一款开源工具,用于解析和分析Thread Dump文件,提供更直观的线程状态展示和更深入的分析功能。 - **特性**:tda可以将复杂的Thread Dump信息转化为易于理解的图表和报告,比如线程树视图、死锁...

    TDA - Thread Dump Analyzer 2.3.2

    TDA,全称Thread Dump Analyzer,是由开发者irockel在GitHub上开源的一款工具(https://github.com/irockel/tda),其主要功能是解析和分析Java应用产生的线程转储文件,帮助我们理解程序的执行状态,特别是当系统...

    java 性能分析工具-IBM thread and Monitor Dump Analyzer

    Java性能分析是优化Java应用程序的关键环节,而IBM Thread and Monitor Dump Analyzer是一款强大的工具,专为了解决Java应用程序中的性能问题,特别是线程和监视器(锁)相关的瓶颈。这款工具能够帮助开发者深入分析...

    Java Thread Dumps 分析

    Java线程转储(Thread Dump)是Java应用程序在特定时间点对所有运行线程的状态快照,它包含每个线程的详细信息,如线程ID、线程名称、线程状态以及栈轨迹。分析Java线程转储对于诊断Java应用程序中的性能问题、死锁...

    TDA-Thread Dump Analyzer - tda-bin-2.3.3.zip

    TDA(Thread Dump Analyzer)是一个专门用于解析和分析Java线程Dump的日志文件的工具,它可以帮助开发者快速定位线程阻塞、死锁等问题,从而优化应用程序的性能。 **一、什么是线程Dump** 线程Dump是Java虚拟机在...

    Thread Dump Analyzer - tda-bin-2.3.3

    Thread Dump Analyzer(简称TDA)是一款强大的工具,专门设计用于解析和分析Java应用程序中的线程转储(Thread Dump)日志。线程转储是Java虚拟机(JVM)在特定时间点生成的一种快照,它包含了应用程序中所有活动...

    IBM Thread and Monitor Dump Analyzer (TMDA)

    IBM Thread and Monitor Dump Analyzer (TMDA) 是一个专门用于分析Java应用程序的线程和监控器转储的工具。在Java应用开发和运维过程中,线程 dump 是诊断和解决性能问题、死锁、线程阻塞等关键问题的重要手段。TMDA...

Global site tag (gtag.js) - Google Analytics