通过Java thread dump分析找到耗费CPU最高的源代码
作者:胡家辉 2010-04-11
最近产品在运行过程中出现了性能问题,在很低的流量的情况下CPU就达到40%,流量稍高时CPU就达到98%。
产品是Java写的,运行于JBOSS平台。操作系统为redhat linux。当你通过top命令发现你的应用程序的进程占用CPU达98%时,我想你肯定想知道究竟是哪个地方耗费了如此的CPU处理时间。通过thread dump分析就可以找到,但这只是解决问题的第一步,即找到问题的所在。
首先:如何产生thread dump日志?
第一步:找到应用程序所在的进程号,通过top命令可以找到,不详述。
第二步:执行kill -3 pid获取thread dump日志(pid就是第一步获取到的)。注意:在不同的linux环境下执行输出的日志的地方可能不同。在IBM的PowerPC小型机上的linux上执行kill -3 pid会在工作目录下产生类似javacore.20100409.161739.7614.0001.txt的文件。而在我所在的环境中,thread dump信息输出到JBOSS的日志文件中的。
其次:获取线程信息
大多数服务器应用都是多线程,因此必须查到具体是哪些线程占用的CPU高。通过top –H命令可以查看到应用程序的线程信息及占用CPU的情况。
如下所示:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4280 nbg-syst 18 0 3608m 2.0g 21m R 93.6 25.9 5004:49 java
4279 nbg-syst 18 0 3608m 2.0g 21m R 92.6 25.9 4876:40 java
4281 nbg-syst 18 0 3608m 2.0g 21m R 92.6 25.9 3892:54 java
4282 nbg-syst 18 0 3608m 2.0g 21m R 91.2 25.9 4954:40 java
4244 nbg-syst 15 0 3608m 2.0g 21m S 3.3 25.9 168:34.04 java
PID所在的列即是对应的线程ID,这是十进制的。
最后:找到耗费CPU高的线程及对应的源代码
取上面耗费CPU最高的第一行的PID 4280,将其转化为十六进制得到0x10b8。然后在thread dump日志中搜索0x10b8,将会搜到如下信息:
"Stack.ClientSelector-1" daemon prio=10 tid=0x000000004baeec00 nid=0x10b8 runnable [0x0000000053169000..0x0000000053169c90]
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
at sun.nio.ch.EPollArrayWrapper.poll(Unknown Source)
at sun.nio.ch.EPollSelectorImpl.doSelect(Unknown Source)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(Unknown Source)
- locked <0x00002aaac4105468> (a sun.nio.ch.Util$1)
- locked <0x00002aaac4131670> (a java.util.Collections$UnmodifiableSet)
- locked <0x00002aaac3f79c78> (a sun.nio.ch.EPollSelectorImpl)
at sun.nio.ch.SelectorImpl.select(Unknown Source)
at com.*****.warlock.protocolstack.impl.layer2.nio.ActiveSelectorImpl.callSelect(ActiveSelectorImpl.java:288)
at com. *****.warlock.protocolstack.impl.layer2.nio.ActiveSelectorImpl.run(ActiveSelectorImpl.java:163)
上面日志中的nid即是线程号。这样可以清晰的看到耗费CPU的源代码的具体位置,可以精确到行号。
备注:上面有部分采用*****是为了屏蔽公司版权信息而设置的,不是*哈。以上举例都是基于HP Blade硬件,redhat企业版操作系统和Sun的JDK。
结束语:thread dump的作用远不只一点,比如还可以从中发现很多应用程序运行问题,比如死锁等。对于该日志还有一个Eclipse插件的可视化分析工具lockness,我试了一下感觉不错。大家可以参考(3)。
下面是关于这个话题的很好的参考资料,一并列出供大家参考。
参考文献:
(1) http://weblogic.sys-con.com/node/44027 Analyzing Java Application Problems--Using Java thread dumps to assess the problem
(2) http://publib.boulder.ibm.com/infocenter/wasinfo/v4r0/index.jsp?topic=/com.ibm.support.was40.doc/html/100__CPU_Usage/swg21162381.html Determining which Java thread is consuming CPU cycles on Solaris systems
(3) http://lockness.plugin.free.fr/home.php Lockness Eclipse Plugin for thread dump GUI analysis tool
分享到:
相关推荐
通过分析 Thread Dump,可以找到导致 CPU 高的线程,从而定位性能瓶颈。 获取 Thread Dump 有多种方式,包括使用 `kill` 命令发送信号量给 JVM 进程,或者使用 `jstack` 命令。其中,`jstack` 命令是一个 Java ...
Java线程分析工具(TDA)是一款专为Java开发者设计的强大工具,用于解析和理解Java应用程序的线程转储(thread dump)。线程转储是Java虚拟机(JVM)在特定时刻生成的一种快照,其中包含了应用程序中所有活动线程的状态...
java 线程Dump 分析工具: Java的TDA线程转储分析器是一个用于分析Sun Java VM生成的线程转储和堆信息的小型Swing GUI(目前用1.4测试)。它从提供的日志文件中解析线程转储和类直方图。它提供关于发现的线程转储的...
Java内存dump分析和Thread Dump(Java Core)是Java性能调优中的重要环节,它们能帮助开发者定位和解决系统中的各种问题,如内存泄漏、线程阻塞等。下面将详细介绍这两个概念及其分析工具。 首先,Java堆内存dump,...
Java Thread Dump Analyzing
在Java虚拟机(JVM)的运行过程中,有时会出现性能问题或者系统挂起的情况,这时候我们需要深入了解线程的运行状态,这就是"IBM thread dump文件分析工具"的作用所在。线程dump文件是JVM在特定时刻生成的一种快照,...
IBM最新java threaddump 分析工具 java -jar jca.jar -Xmx1024m jca.jar
Java线程转储(Thread Dump)是诊断Java应用程序性能问题和异常情况的重要工具。它提供了一个运行中的Java应用中所有线程的快照,详细显示每个线程的状态、堆栈跟踪以及线程名称。线程状态包括RUNNABLE、BLOCKED、...
这个文件最重要的作用就是分析 Java 堆内存泄露问题,heap analyzer,MAT 等工具都可以分析这种文件。 Java core 文件保存的是 java 应用程序在崩溃时或任一时刻关于 Java 运行环境的各种信息。包括 Java 虚拟机的...
JAVA线程dump的分析 JAVA线程dump是指在JAVA程序中,当前线程的状态和调用堆栈的快照,能够帮助开发者了解当前程序的执行情况,诊断问题和性能瓶颈。生成JAVA线程dump的方法在不同的操作系统下是不同的,在Windows...
性能测试,线程的 dump 看到线程的 死锁,等待 运行状态
java dump 堆栈 dumpAnalyzer 分析,在日常工作中,经常会遇到,系统跑着跑着就会出现性能问题,CPU居高不下。这个时候我们就需要对系统的堆栈信息进行分析。这里就介绍如何使用IBM内存检测工具(dumpAnalyzer)。
总的来说,JavaDump分析是一项非常实用的技术,它通过虚拟机运行时的快照,为开发者提供了一种强有力的分析手段,帮助解决复杂问题。这项技术的普及和应用,能够显著提升Java程序的稳定性和性能。随着Java技术的不断...
Java线程Dump分析工具jstack是Java开发人员和运维人员常用的诊断工具,它能够帮助我们了解Java应用程序中线程的状态,以及线程的执行轨迹。本文将深入解析jstack的使用方法及其在不同场景下的应用。 jstack命令的...
java线程dump自动分析工具 java线程dump自动分析工具 java线程dump自动分析工具
"AIX dump分析工具"是专门用于解析和理解这些dump文件的工具,帮助管理员识别并解决Java应用服务器的问题。本文将详细介绍AIX dump分析工具的工作原理、用途以及如何使用它来分析ha398.jar、ga397.zip和jca37.zip等...
通过以上步骤,我们可以对Java应用程序中的线程问题进行深入分析,找到问题的根本原因,并采取相应的措施进行优化和修复。Thread Dump是Java故障排查的重要工具,熟练掌握其分析方法对于提升Java应用的稳定性和性能...
java Thread Dump 其实就是stack trace。 我们平时经常会碰见java异常,并且得到异常的方法用e.printstacktrace 实际上程序正常运行时也是会有stack trace的,只不过平时不显示出来而已。如何能正常及时显示堆栈信息...
通过`jstack <pid>`命令,我们可以得到每个线程的调用栈信息,从而分析出哪些代码段可能导致了CPU过高或者阻塞。 当遇到内存溢出问题时,通常会先使用`jmap`生成dump文件,然后使用专门的分析工具,如Eclipse ...
好用的线程dump分析工具