`
kavy
  • 浏览: 891511 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

通过Java thread dump分析找到耗费CPU最高的源代码

 
阅读更多

通过Java thread dump分析找到耗费CPU最高的源代码

作者:胡家辉 2010-04-11

最近产品在运行过程中出现了性能问题,在很低的流量的情况下CPU就达到40%,流量稍高时CPU就达到98%

产品是Java写的,运行于JBOSS平台。操作系统为redhat linux。当你通过top命令发现你的应用程序的进程占用CPU98%时,我想你肯定想知道究竟是哪个地方耗费了如此的CPU处理时间。通过thread dump分析就可以找到,但这只是解决问题的第一步,即找到问题的所在。

首先:如何产生thread dump日志?

第一步:找到应用程序所在的进程号,通过top命令可以找到,不详述。

第二步:执行kill -3 pid获取thread dump日志(pid就是第一步获取到的)。注意:在不同的linux环境下执行输出的日志的地方可能不同。在IBMPowerPC小型机上的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企业版操作系统和SunJDK

 

结束语: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

分享到:
评论

相关推荐

    java thread dump 分析

    通过分析 Thread Dump,可以找到导致 CPU 高的线程,从而定位性能瓶颈。 获取 Thread Dump 有多种方式,包括使用 `kill` 命令发送信号量给 JVM 进程,或者使用 `jstack` 命令。其中,`jstack` 命令是一个 Java ...

    Java thread dump analyzer (tda)

    Java线程分析工具(TDA)是一款专为Java开发者设计的强大工具,用于解析和理解Java应用程序的线程转储(thread dump)。线程转储是Java虚拟机(JVM)在特定时刻生成的一种快照,其中包含了应用程序中所有活动线程的状态...

    java 线程 dump 分析工具 2.3.3

    java 线程Dump 分析工具: Java的TDA线程转储分析器是一个用于分析Sun Java VM生成的线程转储和堆信息的小型Swing GUI(目前用1.4测试)。它从提供的日志文件中解析线程转储和类直方图。它提供关于发现的线程转储的...

    java 内存dump分析和thread dump(java core)分析

    Java内存dump分析和Thread Dump(Java Core)是Java性能调优中的重要环节,它们能帮助开发者定位和解决系统中的各种问题,如内存泄漏、线程阻塞等。下面将详细介绍这两个概念及其分析工具。 首先,Java堆内存dump,...

    Java Thread Dump Analyzing

    Java Thread Dump Analyzing

    IBM thread dump文件分析工具

    在Java虚拟机(JVM)的运行过程中,有时会出现性能问题或者系统挂起的情况,这时候我们需要深入了解线程的运行状态,这就是"IBM thread dump文件分析工具"的作用所在。线程dump文件是JVM在特定时刻生成的一种快照,...

    IBM java coredump(threaddump) analyzer

    IBM最新java threaddump 分析工具 java -jar jca.jar -Xmx1024m jca.jar

    用Java thread dump 去分析程序的问题

    Java线程转储(Thread Dump)是诊断Java应用程序性能问题和异常情况的重要工具。它提供了一个运行中的Java应用中所有线程的快照,详细显示每个线程的状态、堆栈跟踪以及线程名称。线程状态包括RUNNABLE、BLOCKED、...

    javacore和dump分析工具

    这个文件最重要的作用就是分析 Java 堆内存泄露问题,heap analyzer,MAT 等工具都可以分析这种文件。 Java core 文件保存的是 java 应用程序在崩溃时或任一时刻关于 Java 运行环境的各种信息。包括 Java 虚拟机的...

    JAVA线程dump的分析

    JAVA线程dump的分析 JAVA线程dump是指在JAVA程序中,当前线程的状态和调用堆栈的快照,能够帮助开发者了解当前程序的执行情况,诊断问题和性能瓶颈。生成JAVA线程dump的方法在不同的操作系统下是不同的,在Windows...

    JAVA jvm DUMP 内存分析

    性能测试,线程的 dump 看到线程的 死锁,等待 运行状态

    java dump堆栈分析工具

    java dump 堆栈 dumpAnalyzer 分析,在日常工作中,经常会遇到,系统跑着跑着就会出现性能问题,CPU居高不下。这个时候我们就需要对系统的堆栈信息进行分析。这里就介绍如何使用IBM内存检测工具(dumpAnalyzer)。

    JavaDump分析

    总的来说,JavaDump分析是一项非常实用的技术,它通过虚拟机运行时的快照,为开发者提供了一种强有力的分析手段,帮助解决复杂问题。这项技术的普及和应用,能够显著提升Java程序的稳定性和性能。随着Java技术的不断...

    Java线程Dump分析工具jstack解析及使用场景

    Java线程Dump分析工具jstack是Java开发人员和运维人员常用的诊断工具,它能够帮助我们了解Java应用程序中线程的状态,以及线程的执行轨迹。本文将深入解析jstack的使用方法及其在不同场景下的应用。 jstack命令的...

    Java线程dump分析脚本

    java线程dump自动分析工具 java线程dump自动分析工具 java线程dump自动分析工具

    AIX dump分析工具

    "AIX dump分析工具"是专门用于解析和理解这些dump文件的工具,帮助管理员识别并解决Java应用服务器的问题。本文将详细介绍AIX dump分析工具的工作原理、用途以及如何使用它来分析ha398.jar、ga397.zip和jca37.zip等...

    java故障排查ThreadDump

    通过以上步骤,我们可以对Java应用程序中的线程问题进行深入分析,找到问题的根本原因,并采取相应的措施进行优化和修复。Thread Dump是Java故障排查的重要工具,熟练掌握其分析方法对于提升Java应用的稳定性和性能...

    java Thread Dump Lockness检查死锁

    java Thread Dump 其实就是stack trace。 我们平时经常会碰见java异常,并且得到异常的方法用e.printstacktrace 实际上程序正常运行时也是会有stack trace的,只不过平时不显示出来而已。如何能正常及时显示堆栈信息...

    java dump分析工具ha456

    通过`jstack &lt;pid&gt;`命令,我们可以得到每个线程的调用栈信息,从而分析出哪些代码段可能导致了CPU过高或者阻塞。 当遇到内存溢出问题时,通常会先使用`jmap`生成dump文件,然后使用专门的分析工具,如Eclipse ...

    好用的线程dump分析工具

    好用的线程dump分析工具

Global site tag (gtag.js) - Google Analytics