- 浏览: 272425 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
somefuture:
为何有文章说asyncAppdender不支持J2ee容器ht ...
log4j 日志异步化AsyncAppender 大幅提升系统性能 -
model2012:
你用adt跑的吧,android里面是不能直接运行main方法 ...
JVM崩溃:Current thread JavaThread "CompilerThread1" daemon [_thre -
di1984HIT:
不错。学习了啊
.rmi.ConnectException: Connection refused to host: 127.0.0.1来龙去脉 -
gygwoaini:
还有可能是第3个问号没给值
索引中丢失 IN 或 OUT 参数:: 3 -
fool2011:
多谢
索引中丢失 IN 或 OUT 参数:: 3
Thread Dump是非常有用的诊断Java应用问题的工具,每一个Java虚拟机都有及时生成显示所有线程在某一点状态的thread-dump的能力。虽然 各个Java虚拟机thread dump打印输出格式上略微有一些不同,但是Thread dumps出来的信息包含线程;线程的运行状态、标识和调用的堆栈;调用的堆栈包含完整的类名,所执行的方法,如果可能的话还有源代码的行数。
Thread Dump特点:
- 能在各种操作系统下使用
- 能在各种Java应用服务器下使用
- 可以在生产环境下使用而不影响系统的性能
- 可以将问题直接定位到应用程序的代码行上
Thread Dump能诊断的问题包括:
- 查找内存泄露,常见的是程序里load大量的数据到缓存
- 发现死锁线程
Sun的JVM用下列方法可以产生Thread Dump堆栈信息:
1,Solaris OS
<ctrl>-’\’ (Control-Backslash)
kill -QUIT <pid>2, HP-UX/UNIX/Linux
Kill -3
PID
PID通过下面方法获取ps -efHl | grep 'java' **. **
3,Windows
直接对MSDOS窗口的程序按Ctrl-break
有些Java应用服务器是在控制台上运行,如Weblogic,为了方便获取threaddump信息,在weblogic启动的时候,最好将其标准输出重定向到一个文件,用"nohup sh startWebLogic.sh > start.log &"命令,执行"kill -3 <pid>",Stack trace就会输出到start.log里。Tomcat的Thread Dump会输出到命令行控制台或者logs的catalina.out文件里。为了 反映线程状态的动态变化,需要接连多次做thread dump,每次间隔10-20s。
IBM JVM下产生Thread Dump:
在AIX上用IBM的JVM,内存溢出时默认地会产生javacore文件(关于cpu的)和heapdump文件(关于内存的)。如果没有参照下列方法:
1 choose one cluster member, set the following before this server start:
在was启动前设置下面环境变量(可以加在启动脚本中)
export IBM_HEAPDUMP=true
export IBM_HEAP_DUMP=true
export IBM_HEAPDUMP_OUTOFMEMORY=true
export IBM_HEAPDUMPDIR=<directory path>2 please use set command to make sure you do not have DISABLE_JAVADUMP parameter
then start this cluster member.
用set命令检查参数设置,确保没有设置DISABLE_JAVADUMP,然后启动server3 when you find free memory < 50% when no heavy access, please run kill -3 <pid>
执行kill -3 <pid>命令可以生成javacore文件和heapdump文件(pid为was java进程的id号,可以用ps -ef|grep java 查到),可以多执行几次,按照下面操作进行ps -ef > psef1.txt
ps aux > psaux1.txt
vmstat 5 10 > vmstat.txt
kill -3 <app server id>
wait for 2 mins
kill -3 <app server id>
wait for 2 mins
kill -3 <app server id>
netstat -an> netstat2.txt
ps -ef > psef2.txt
ps aux > psaux2.txt
将上面产生的 txt 文件和/usr/WebSphere/AppServer/javacore*文件和heapdump文件拷贝到本地,然后删除这些文件,因为这些文件会占用较大的文件系统空间。
将/usr/WebSphere/AppServer/logs/wlmserver1(或2)目录下当天产生的日志拷贝出来
在IBM
JVM产生的javacore或者Threaddump文件中应用服务器Web容器的常见线程状态:
Idle线程:一个已经准备好接受请求的线程,但是没有和插件或者客户端建立连接
Keep-Alive线程:是一个已经准备好接受请求的线程,并且已经和插件或者客户端建立连接
正在接受请求的线程:是一个线程正在读取request的内容或者头部
下面就给出各种线程在javacore或者Threaddump中的表现形式:
Idle线程:
"Servlet.Engine.Transports : 20" (TID:0x427F190,
sys_thread_t:0x15D175E8, state:R, native ID:0xBB8)
prio=5
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:429)
at
com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161)
at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java(Compiled
Code)) at
com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java(Compiled
Code))
Keep-alive线程 (非SSL模式):
"Servlet.Engine.Transports : 20" (TID:0x427F190,
sys_thread_t:0x15D175E8, state:R, native ID:0xBB8)
prio=5
at java.net.SocketInputStream.socketRead(Native
Method)
at
java.net.SocketInputStream.read(SocketInputStream.java:86)
at com.ibm.ws.io.Stream.read(Stream.java)
at
com.ibm.ws.io.ReadStream.readBuffer(ReadStream.java)
at com.ibm.ws.io.ReadStream.read(ReadStream.java)
at
com.ibm.ws.http.HttpRequest.readRequestLine(HttpRequest.java)
at
com.ibm.ws.http.HttpRequest.readRequest(HttpRequest.java)
at
com.ibm.ws.http.HttpConnection.readAndHandleRequest(HttpConnection.java)
at
com.ibm.ws.http.HttpConnection.run(HttpConnection.java)
at com.ibm.ws.util.CachedThread.run(ThreadPool.java)
Keep-alive线程 (SSL模式):
"Servlet.Engine.Transports : 12" (TID:0x458DBA18,
sys_thread_t:0x60B297C0, state:R, native ID:0x427E)
prio=5
at java.net.SocketInputStream.socketRead(Native
Method)
at
java.net.SocketInputStream.read(SocketInputStream.java(Compiled
Code))
at com.ibm.sslite.s.a(Unknown Source)(Compiled Code)
at com.ibm.sslite.s.b(Unknown Source)(Compiled Code)
at com.ibm.sslite.s.a(Unknown Source)(Compiled Code)
at com.ibm.sslite.a.read(Unknown Source)(Compiled
Code)
at com.ibm.jsse.a.read(Unknown Source)(Compiled
Code)
at com.ibm.ws.io.Stream.read(Stream.java(Compiled
Code))
at com.ibm.ws.io.ReadStream.readBuffer(ReadStream.java(Inlined
Compiled Code))
at com.ibm.ws.io.ReadStream.read(ReadStream.java(Inlined
Compiled Code))
at
com.ibm.ws.http.HttpRequest.readRequestLine(HttpRequest.java(Compiled
Code))
at
com.ibm.ws.http.HttpRequest.readRequest(HttpRequest.java(Compiled
Code))
at
com.ibm.ws.http.HttpConnection.readAndHandleRequest(HttpConnection)
at
com.ibm.ws.http.HttpConnection.run(HttpConnection.java(Compiled
Code))
at
com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:672)
正在接受请求的线程:
at java.net.SocketInputStream.socketRead(Native
Method)
at
java.net.SocketInputStream.read(SocketInputStream.java:85)
at com.ibm.ws.io.Stream.read(Stream.java:17)
at
com.ibm.ws.io.ReadStream.readBuffer(ReadStream.java:411)
at
com.ibm.ws.io.ReadStream.read(ReadStream.java:110)
at
com.ibm.ws.http.HttpConnection.run(HttpConnection.java:448)
at
com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:672)
Sun
JVM的常见线程状态:
对于thread dump信息,主要关注的是线程的状态和其执行堆栈
线程的状态一般为三类
Runnable(R):当前可以运行的线程
Waiting on monitor(CW):线程主动wait
Waiting for monitor entry(MW):线程等锁
一般关注的都是第一和第三种状态的线程
Cpu很忙则关注runnable的线程
Cpu闲则关注waiting for monitor entry的线程
一种典型的死锁是由于在server端应用(比如servlet)中请求由同一weblogic实例server的资源
解决办法就是将该servlet放到另外的执行队列里去执行
下面给出一个典型的死锁线程(注意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)
UNIX/Linux下可用top、vmstat或prstat 命令观察系统资源状况
发表评论
-
用Eclipse Compiler编译Java项目
2013-03-21 20:18 4010我们经常使 ... -
jvm 生成 javacore 和 heapdump 文件
2013-01-21 11:55 18063一、标准的SUN/Oracle JVM 当内存溢 ... -
Java 6 JVM参数选项大全(中文版)
2012-09-11 15:20 891作者:Ken Wu Email: ken.wug@gm ... -
JVM crash的几种可能原因
2012-02-17 14:15 1209Java的应用有时候会因为各种原因Crash,这时候会产生一个 ... -
JDK heapdump
2011-09-06 11:14 1172因jdk6不支持 ctrl+break,需使用jmap E ... -
non-heap中的内容
2011-07-07 15:41 1708Permanent Generation (non-heap) ... -
jvm .hotspot_compiler
2011-05-25 15:47 932This has been identified as a J ... -
Troubleshooting Guide for Java SE 6 with HotSpot VM
2011-05-25 14:59 1051http://www.oracle.com/technetwo ... -
J VM Crash- 64bit VM Crash in CompilerThread1
2011-05-25 14:39 1687There is a strong change t ... -
Jprofiler: error iterating over heap
2010-11-18 22:03 1354Fixed it. I had to remove " ... -
Java垃圾回收——内存结构
2010-11-18 21:36 1099一般处理过程:minor collections occurr ... -
Java垃圾回收——设置内存大小
2010-11-18 21:34 1576At initialization of the virtu ... -
Java垃圾回收——throughput collector
2010-11-18 21:33 1179The throughput collector will t ... -
Java垃圾回收—— concurrent collector
2010-11-18 21:32 1122With the serial collector a m ... -
JAVA进程内存(本机内存)的使用情况
2010-11-03 11:08 1958什么是本机内存: 即进程内存。本机内存是可用于运行时进 ... -
64 位操作系统上java进程能分配的内存大小
2010-11-03 11:01 140364 位操作系统上的用户空间大小 操作系统 默认用户空间大 ... -
使用jconsole的前提条件
2010-10-13 17:26 1090为了快速调试,使用简单方式: 本地: java -D ... -
JVM可创建的最大线程数
2010-07-09 17:25 4753限制该值的因素: 线程堆栈大小——》进程的最大内存—— ... -
weblogic 如何产生JVM Thread Dump
2009-10-16 11:16 5068产生JVM Thread Dump是检查多线程应用 最好 ... -
J java.net.SocketInputStream.socketRead0(Ljava/io/FileDescriptor;[BIII)I
2009-09-22 19:08 4720Bug ID: ...
相关推荐
包括 堆内存dump分析工具和thread dump(java core)的分析工具 还包括两篇关于dump分析的文档,分析java系统内存泄露死循环等非常需要啊有木有
java thread dump 分析
java线程分析工具
Java Thread Dump Analyzing
分析线程情况 JavaCore 或 ThreadDump文件,即线程的映像,用来分析线程资源锁等情况
Thread and Monitor Dump Analyzer for Java
IBM Thread and Monitor Dump Analyzer for Java(简称 jca)。它可以识别Java线程中的挂起,死锁,资源竞争,和瓶颈。 使用方法: java -Xmx1000m -jar jca456.jar
Java core 文件保存的是 java 应用程序在崩溃时或任一时刻关于 Java 运行环境的各种信息。包括 Java 虚拟机的参数,环境变量,内存段的分配情况,垃圾回收日志,各种内部锁的状态,各线程在当前时刻的运行栈,以及类...
IBM 线程堆栈分析工具,IBM Thread and Monitor Dump Analyzer for java
java 线程Dump 分析工具: Java的TDA线程转储分析器是一个用于分析Sun Java VM生成的线程转储和堆信息的小型Swing GUI(目前用1.4测试)。它从提供的日志文件中解析线程转储和类直方图。它提供关于发现的线程转储的...
thread and mointor dump analyzer,java线程文件分析工具
IBM最新java threaddump 分析工具 java -jar jca.jar -Xmx1024m jca.jar
java Thread Dump 其实就是stack trace。 我们平时经常会碰见java异常,并且得到异常的方法用e.printstacktrace 实际上程序正常运行时也是会有stack trace的,只不过平时不显示出来而已。如何能正常及时显示堆栈信息...
对java产生的ThreadDump文件进行定位分析,找出问题根本原因。
个人在实际项目实施过程中整理的资料。 很有说服力
性能测试,线程的 dump 看到线程的 死锁,等待 运行状态
java堆栈信息dump文件
Thread Dump导出脚本,执行./thread.sh <pid>
AIX系统收集Heapdump及javacore
Thread Dump Analyzer用于分析线程dump文件,将dump文件导入到tda中。找到阻塞的线程。阻塞的线程是红色的。