- 浏览: 207505 次
- 性别:
- 来自: 宇宙
文章分类
最新评论
-
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 809转:http://www.cnblogs.com/wang ... -
通过kill命令获取Java程序卡死的thread dump日志
2014-08-26 18:07 2498最近一个接收数据的应用,经常莫名其妙的卡死,出现这种情况时 ... -
《Java并发编程实践》阅读笔记
2013-03-18 10:36 0《Java并发编程实践》 知识要点 一 ... -
用Wrapper将java程序注册为服务
2013-03-12 14:35 989Wrapper是Java官方推荐的产品,可以把编写的程序注 ... -
《Java并发编程实战》阅读笔记
2012-12-31 17:34 0知识要点 1、 2、 阅读进度 ——201 ... -
Hibernate 一对多 oracle
2012-12-12 17:24 797一对多,一方 @Entity @Table(name ... -
Tomcat SessionId长度
2012-11-23 10:26 2368最近在做一个接口项目,其中有一个接口的节点在规范中明确要 ... -
tomcat https配置
2012-11-22 11:01 11791、生成证书 # JAVA_HOME/bin/k ... -
Ant打包java project自动生成manifest文件
2012-11-05 11:21 1823用Ant打包java project,自动生成manifest ... -
Log4j.properties配置详解
2012-10-30 09:56 868一、Log4j简介 Log4j ... -
TCP/IP通信程序设计的丰富多样性(长短连接)
2012-10-15 10:01 849刚接触TCP/IP通信设计的人根据范例可以很快编出一个通 ... -
Redis安装与Java客户端Jedis
2012-10-10 11:40 1538最近,有个Java ... -
Java虚拟机JVM的设置和调优
2012-09-29 10:40 1524一、堆 -Xmx3550m:设置JV ... -
Java系统监控、性能调优工具
2012-09-28 17:37 1473Java的监控与性能调优工具很多,除了JDK自带的一些工具外, ... -
Jprofiler6的安装与使用
2012-09-28 16:40 1516在实际使用过程中, ... -
Linux下java程序启动脚本
2012-09-28 10:51 1547#!/bin/sh # #该脚本为Linux下启动j ... -
linux+java+tomcat
2012-09-25 15:40 852一、安装java 1、安装jdk ... -
Java实现缓存之HashMap及ConcurrentHashMap
2012-09-25 14:47 2334最近,在一个项目中需要将大量的键值对数据缓存在内存中,以 ... -
Myeclipse启动速度优化
2012-08-31 14:38 7791、去除不需要加载的 ... -
[转]详细解析Java中抽象类和接口的区别
2012-08-30 14:13 582在Java语言中, abstract class 和inter ...
相关推荐
java thread dump 分析
包括 堆内存dump分析工具和thread dump(java core)的分析工具 还包括两篇关于dump分析的文档,分析java系统内存泄露死循环等非常需要啊有木有
java 线程Dump 分析工具: Java的TDA线程转储分析器是一个用于分析Sun Java VM生成的线程转储和堆信息的小型Swing GUI(目前用1.4测试)。它从提供的日志文件中解析线程转储和类直方图。它提供关于发现的线程转储的...
java线程分析工具
java线上故障分析-线程dump,堆内存分析
这个文件最重要的作用就是分析 Java 堆内存泄露问题,heap analyzer,MAT 等工具都可以分析这种文件。 Java core 文件保存的是 java 应用程序在崩溃时或任一时刻关于 Java 运行环境的各种信息。包括 Java 虚拟机的...
Java Thread Dump Analyzing
IBM最新java threaddump 分析工具 java -jar jca.jar -Xmx1024m jca.jar
thread and mointor dump analyzer,java线程文件分析工具
性能测试,线程的 dump 看到线程的 死锁,等待 运行状态
分析线程情况 JavaCore 或 ThreadDump文件,即线程的映像,用来分析线程资源锁等情况
java dump 堆栈 dumpAnalyzer 分析,在日常工作中,经常会遇到,系统跑着跑着就会出现性能问题,CPU居高不下。这个时候我们就需要对系统的堆栈信息进行分析。这里就介绍如何使用IBM内存检测工具(dumpAnalyzer)。
IBM 线程堆栈分析工具,IBM Thread and Monitor Dump Analyzer for java
用Java thread dump 去分析程序的问题,英文版的word文档,对于分析定位程序问题。
java Thread Dump 其实就是stack trace。 我们平时经常会碰见java异常,并且得到异常的方法用e.printstacktrace 实际上程序正常运行时也是会有stack trace的,只不过平时不显示出来而已。如何能正常及时显示堆栈信息...
IBM Thread and Monitor Dump Analyzer for Java(简称 jca)。它可以识别Java线程中的挂起,死锁,资源竞争,和瓶颈。 使用方法: java -Xmx1000m -jar jca456.jar
JavaCore和HeapDump分析工具
对java产生的ThreadDump文件进行定位分析,找出问题根本原因。
javacore文件及heapdump文件分析
来自一个公司研究院的JavaDump分析,包括原理讲解,实战解析