- 浏览: 212931 次
- 性别:
- 来自: 宇宙
文章分类
最新评论
-
naryCC:
虽然没有smarty那么方便,但是由于我们的环境太老不得不使用 ...
SmartTemplate -
victorwmh:
我们项目是Java项目,但数据源来自不同的地方,有些还是合作单 ...
和C++相对应Java的CheckSum -
cuisuqiang:
那你们到底是Java项目还是C++的项目?
和C++相对应Java的CheckSum -
david.org:
attempt to write a readonly dat ...
linux+apache+subversion版本控制 -
victorwmh:
wellee 写道兄弟,我怎么配置ZendDebugger老是 ...
Zend Debugger和Zend Optimizer配置(Windows)
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分析工具。
发表评论
-
ant build.xml详解
2014-09-12 16:57 847转:http://www.cnblogs.com/wang ... -
通过kill命令获取Java程序卡死的thread dump日志
2014-08-26 18:07 2569最近一个接收数据的应用,经常莫名其妙的卡死,出现这种情况时 ... -
《Java并发编程实践》阅读笔记
2013-03-18 10:36 0《Java并发编程实践》 知识要点 一 ... -
用Wrapper将java程序注册为服务
2013-03-12 14:35 1026Wrapper是Java官方推荐的产品,可以把编写的程序注 ... -
《Java并发编程实战》阅读笔记
2012-12-31 17:34 0知识要点 1、 2、 阅读进度 ——201 ... -
Hibernate 一对多 oracle
2012-12-12 17:24 867一对多,一方 @Entity @Table(name ... -
Tomcat SessionId长度
2012-11-23 10:26 2400最近在做一个接口项目,其中有一个接口的节点在规范中明确要 ... -
tomcat https配置
2012-11-22 11:01 12221、生成证书 # JAVA_HOME/bin/k ... -
Ant打包java project自动生成manifest文件
2012-11-05 11:21 1862用Ant打包java project,自动生成manifest ... -
Log4j.properties配置详解
2012-10-30 09:56 908一、Log4j简介 Log4j ... -
TCP/IP通信程序设计的丰富多样性(长短连接)
2012-10-15 10:01 892刚接触TCP/IP通信设计的人根据范例可以很快编出一个通 ... -
Redis安装与Java客户端Jedis
2012-10-10 11:40 1574最近,有个Java ... -
Java虚拟机JVM的设置和调优
2012-09-29 10:40 1573一、堆 -Xmx3550m:设置JV ... -
Java系统监控、性能调优工具
2012-09-28 17:37 1508Java的监控与性能调优工具很多,除了JDK自带的一些工具外, ... -
Jprofiler6的安装与使用
2012-09-28 16:40 1552在实际使用过程中, ... -
Linux下java程序启动脚本
2012-09-28 10:51 1577#!/bin/sh # #该脚本为Linux下启动j ... -
linux+java+tomcat
2012-09-25 15:40 893一、安装java 1、安装jdk ... -
Java实现缓存之HashMap及ConcurrentHashMap
2012-09-25 14:47 2374最近,在一个项目中需要将大量的键值对数据缓存在内存中,以 ... -
Myeclipse启动速度优化
2012-08-31 14:38 8191、去除不需要加载的 ... -
[转]详细解析Java中抽象类和接口的区别
2012-08-30 14:13 661在Java语言中, abstract class 和inter ...
相关推荐
Java Thread Dump 分析是 Java 应用程序性能优化的重要工具之一。Thread Dump 是 JVM 的一个快照,记录了当前所有线程的状态,包括线程的 ID、名称、状态、锁信息等。通过分析 Thread Dump,可以找到导致 CPU 高的...
3. **Thread Dump Analyzer**:开源工具,可自动分析Thread Dump,识别出可能的问题模式,如死锁、线程等待等。 4. **Async Debugging in IntelliJ IDEA / Eclipse**:集成开发环境也提供了查看和分析Thread Dump的...
Java线程分析工具(TDA)是一款专为Java开发者设计的强大工具,用于解析和理解Java应用程序的线程转储(thread dump)。线程转储是Java虚拟机(JVM)在特定时刻生成的一种快照,其中包含了应用程序中所有活动线程的状态...
Java线程转储(Thread Dump)是诊断Java应用程序性能问题和异常情况的重要工具。它提供了一个运行中的Java应用中所有线程的快照,详细显示每个线程的状态、堆栈跟踪以及线程名称。线程状态包括RUNNABLE、BLOCKED、...
Thread Dump是Java应用程序故障排查的重要工具之一,它不仅能够帮助我们迅速定位问题所在,还能够在一定程度上预测和避免潜在的问题。通过对Thread Dump的有效分析,我们可以更好地理解和优化Java应用的行为,提高...
本文中,我们使用SUN的hotspot JVM 5.0_06为例,展示了如何生成和分析JAVA线程dump,帮助开发者诊断和优化JAVA程序。 在JAVA程序中,线程分析是非常重要的,了解当前程序的执行情况,能够帮助开发者诊断问题和性能...
IBM Thread and Monitor Dump Analyzer for Java 是一款专门针对Java应用程序的诊断工具,主要用于解析和分析Java核心转储(javacore)文件。这类文件通常在Java应用程序遇到问题,如挂起、内存溢出或异常时自动生成...
TDA(Thread Dump Analyzer)是一款强大的Java线程分析工具,它能够帮助开发者深入理解应用在运行时的线程状态,包括线程的阻塞情况、等待资源、死锁等问题。下面将详细介绍TDA的使用方法、功能以及它如何帮助我们...
java Thread Dump 其实就是stack trace。 我们平时经常会碰见java异常,并且得到异常的方法用e.printstacktrace 实际上程序正常运行时也是会有stack trace的,只不过平时不显示出来而已。如何能正常及时显示堆栈信息...
线程Dump分析器,简称TDA,是一款专业工具,专门设计用于解析和分析Java应用程序的线程转储(Thread Dump)文件。线程转储是在特定时间点应用程序中所有线程的状态快照,它包含了每个线程的详细信息,如线程ID、线程...
当Java程序出现挂起(hung)或者死锁(Deadlock)等问题时,jstack尤为重要。它可以显示出每个线程的堆栈跟踪,揭示出哪些线程正忙于执行任务,哪些线程被阻塞等待资源,以及等待的具体条件是什么。 在dump文件中,...
- **功能**:tda是一款开源工具,用于解析和分析Thread Dump文件,提供更直观的线程状态展示和更深入的分析功能。 - **特性**:tda可以将复杂的Thread Dump信息转化为易于理解的图表和报告,比如线程树视图、死锁...
TDA,全称Thread Dump Analyzer,是由开发者irockel在GitHub上开源的一款工具(https://github.com/irockel/tda),其主要功能是解析和分析Java应用产生的线程转储文件,帮助我们理解程序的执行状态,特别是当系统...
Java性能分析是优化Java应用程序的关键环节,而IBM Thread and Monitor Dump Analyzer是一款强大的工具,专为了解决Java应用程序中的性能问题,特别是线程和监视器(锁)相关的瓶颈。这款工具能够帮助开发者深入分析...
Java线程转储(Thread Dump)是Java应用程序在特定时间点对所有运行线程的状态快照,它包含每个线程的详细信息,如线程ID、线程名称、线程状态以及栈轨迹。分析Java线程转储对于诊断Java应用程序中的性能问题、死锁...
TDA(Thread Dump Analyzer)是一个专门用于解析和分析Java线程Dump的日志文件的工具,它可以帮助开发者快速定位线程阻塞、死锁等问题,从而优化应用程序的性能。 **一、什么是线程Dump** 线程Dump是Java虚拟机在...
Thread Dump Analyzer(简称TDA)是一款强大的工具,专门设计用于解析和分析Java应用程序中的线程转储(Thread Dump)日志。线程转储是Java虚拟机(JVM)在特定时间点生成的一种快照,它包含了应用程序中所有活动...
IBM Thread and Monitor Dump Analyzer (TMDA) 是一个专门用于分析Java应用程序的线程和监控器转储的工具。在Java应用开发和运维过程中,线程 dump 是诊断和解决性能问题、死锁、线程阻塞等关键问题的重要手段。TMDA...