- 浏览: 208798 次
- 性别:
- 来自: 宇宙
文章分类
最新评论
-
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 818转:http://www.cnblogs.com/wang ... -
通过kill命令获取Java程序卡死的thread dump日志
2014-08-26 18:07 2511最近一个接收数据的应用,经常莫名其妙的卡死,出现这种情况时 ... -
《Java并发编程实践》阅读笔记
2013-03-18 10:36 0《Java并发编程实践》 知识要点 一 ... -
用Wrapper将java程序注册为服务
2013-03-12 14:35 1002Wrapper是Java官方推荐的产品,可以把编写的程序注 ... -
《Java并发编程实战》阅读笔记
2012-12-31 17:34 0知识要点 1、 2、 阅读进度 ——201 ... -
Hibernate 一对多 oracle
2012-12-12 17:24 807一对多,一方 @Entity @Table(name ... -
Tomcat SessionId长度
2012-11-23 10:26 2377最近在做一个接口项目,其中有一个接口的节点在规范中明确要 ... -
tomcat https配置
2012-11-22 11:01 11921、生成证书 # JAVA_HOME/bin/k ... -
Ant打包java project自动生成manifest文件
2012-11-05 11:21 1830用Ant打包java project,自动生成manifest ... -
Log4j.properties配置详解
2012-10-30 09:56 874一、Log4j简介 Log4j ... -
TCP/IP通信程序设计的丰富多样性(长短连接)
2012-10-15 10:01 857刚接触TCP/IP通信设计的人根据范例可以很快编出一个通 ... -
Redis安装与Java客户端Jedis
2012-10-10 11:40 1546最近,有个Java ... -
Java虚拟机JVM的设置和调优
2012-09-29 10:40 1535一、堆 -Xmx3550m:设置JV ... -
Java系统监控、性能调优工具
2012-09-28 17:37 1482Java的监控与性能调优工具很多,除了JDK自带的一些工具外, ... -
Jprofiler6的安装与使用
2012-09-28 16:40 1526在实际使用过程中, ... -
Linux下java程序启动脚本
2012-09-28 10:51 1556#!/bin/sh # #该脚本为Linux下启动j ... -
linux+java+tomcat
2012-09-25 15:40 864一、安装java 1、安装jdk ... -
Java实现缓存之HashMap及ConcurrentHashMap
2012-09-25 14:47 2345最近,在一个项目中需要将大量的键值对数据缓存在内存中,以 ... -
Myeclipse启动速度优化
2012-08-31 14:38 7851、去除不需要加载的 ... -
[转]详细解析Java中抽象类和接口的区别
2012-08-30 14:13 589在Java语言中, abstract class 和inter ...
相关推荐
Java Thread Dump 分析是 Java 应用程序性能优化的重要工具之一。Thread Dump 是 JVM 的一个快照,记录了当前所有线程的状态,包括线程的 ID、名称、状态、锁信息等。通过分析 Thread Dump,可以找到导致 CPU 高的...
用Java thread dump 去分析程序的问题,英文版的word文档,对于分析定位程序问题。
java Thread Dump 其实就是stack trace。 我们平时经常会碰见java异常,并且得到异常的方法用e.printstacktrace 实际上程序正常运行时也是会有stack trace的,只不过平时不显示出来而已。如何能正常及时显示堆栈信息...
对java产生的ThreadDump文件进行定位分析,找出问题根本原因。
java程序性能分析thread dump和heap dump,dump文件:在故障定位(尤其是out of memory)和性能分析的时候,dump文件记录了JVM运行期间的内存占用、线程执行等情况。 heap dump:记录某一时刻JVM堆中对象使用情况,哪些...
jstack生成的Thread Dump日志.docx 系统线程状态 (Native Thread Status) 系统线程有如下状态: deadlock 死锁线程,一般指多个线程调用期间进入了相互资源占用,导致一直等待无法释放的情况。 ...
java线程分析工具,能否分析某个时刻的java程序各个线程的状态
Thread_Dump_Analyzing_Tool这是一个基于web的项目,可以用于分析线程转储。这将有助于确定程序是否有死锁,什么是.zip
IBM Thread and Monitor Dump Analyzer for Java专业JVM调优工具 一、使用方法 1.使用java -jar启动程序 2.找到需要分析的jvm进程 3.使用jstack [pid] > /tmp/sdapjvmlog.txt导出进程的详细日志 4.使用程序打开...
10) 你将如何使用 threaddump?你将如何分析 Thread dump? 11) 为什么我们调用 start()方法时会执行 run()方法,为什么我们不能直接调用 run()方法? 12) Java 中你怎样唤醒一个阻塞的线程? 13) 在 Java 中 ...