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

Java应用调试工具之jstack

    博客分类:
  • Java
阅读更多




   本文经历的事情发生在2008年


   本人比较懒,碰到问题才会想到去解决, 一次偶然的机会,发现线上环境的tomcat自从把连接方式改成nio以后,时不时的发现有服务器CPU占用100%的情况。很奇怪的现象,为整个系统带来了不稳定因素,需要尽快解决。于是去网上查找资料,但是没有找到现成的答案。

   定下心来自己分析,先需要知道tomcat中的线程在干什么,于是找到了jstack命令。

命令格式:jstack ${pid} 
 


   其中pid可以通过jps命令获得。

   于是我们可以得到当前应用中工作线程的堆栈, 各个线程分别在做什么 , 比如很多线程都执行在同一个代码块,那这部分就可能有问题。

    结果如下:

 

"MaintThread" daemon prio=10 tid=0x91cd3400 nid=0x4f40 waiting on condition [0x8faec000..0x8faecfb0]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at com.danga.MemCached.SockIOPool$MaintThread.run(SockIOPool.java:1492)

"Thread-3" prio=10 tid=0x8f9ff800 nid=0x4f3f waiting on condition [0x8fb2d000..0x8fb2df30]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at com.tudou.usersrv.client.HotSpareProxyMemcachedClient$1.run(HotSpareProxyMemcachedClient.java:71)

"MaintThread" daemon prio=10 tid=0x91dcfc00 nid=0x4f3e waiting on condition [0x8fb6e000..0x8fb6eeb0]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at com.danga.MemCached.SockIOPool$MaintThread.run(SockIOPool.java:1492)

"MaintThread" daemon prio=10 tid=0x91cd2800 nid=0x4f3d waiting on condition [0x8fbaf000..0x8fbafe30]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at com.danga.MemCached.SockIOPool$MaintThread.run(SockIOPool.java:1492)

"Low Memory Detector" daemon prio=10 tid=0x09a16c00 nid=0x4f37 runnable [0x00000000..0x00000000]
   java.lang.Thread.State: RUNNABLE

"CompilerThread1" daemon prio=10 tid=0x09a15000 nid=0x4f36 waiting on condition [0x00000000..0x9250f688]
   java.lang.Thread.State: RUNNABLE

"CompilerThread0" daemon prio=10 tid=0x09a13800 nid=0x4f35 waiting on condition [0x00000000..0x92590608]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=10 tid=0x09a12800 nid=0x4f34 runnable [0x00000000..0x925d1c10]
   java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=10 tid=0x099ff800 nid=0x4f33 in Object.wait() [0x92812000..0x92812eb0]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)
        - locked <0x978b2300> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)

"Reference Handler" daemon prio=10 tid=0x099ff000 nid=0x4f32 in Object.wait() [0x92853000..0x92853e30]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        at java.lang.Object.wait(Object.java:485)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
        - locked <0x998d4160> (a java.lang.ref.Reference$Lock)

"main" prio=10 tid=0x09918800 nid=0x4f2c runnable [0xf7fb9000..0xf7fba208]
   java.lang.Thread.State: RUNNABLE
        at java.net.PlainSocketImpl.socketAccept(Native Method)
        at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:384)
        - locked <0x978b24f8> (a java.net.SocksSocketImpl)
        at java.net.ServerSocket.implAccept(ServerSocket.java:453)
        at java.net.ServerSocket.accept(ServerSocket.java:421)
        at org.apache.catalina.core.StandardServer.await(StandardServer.java:389)
        at org.apache.catalina.startup.Catalina.await(Catalina.java:642)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:602)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)

"VM Thread" prio=10 tid=0x099fc400 nid=0x4f31 runnable 

"GC task thread#0 (ParallelGC)" prio=10 tid=0x0991f400 nid=0x4f2d runnable 

"GC task thread#1 (ParallelGC)" prio=10 tid=0x09920400 nid=0x4f2e runnable 

"GC task thread#2 (ParallelGC)" prio=10 tid=0x09921400 nid=0x4f2f runnable 

"GC task thread#3 (ParallelGC)" prio=10 tid=0x09922400 nid=0x4f30 runnable 

"VM Periodic Task Thread" prio=10 tid=0x09a18400 nid=0x4f38 waiting on condition 
 

   
    使用linux自带的ps命令:

ps -eL -o pid,%cpu,lwp|grep -i 16907
 


    列出子线程的cpu占用率等情况,再对照jstack命令得到的线程号,就可以知道cpu占用高的线程执行到了那里。

    通过这种方式,确定了是由于tomcat的nio用到了jdk6的nio包,命中了其中的一个死锁bug。apache组织的人也建议在高并发的情况下不要开启nio.

 

     在生产环境中,jstack命令帮助解决了内存泄露引起的垃圾回收线程占用高CPU, 以及服务线程阻塞在某个远程接口处导致无响应等问题。

 

     希望这篇文章可以帮助到大家解决更多问题,谢谢!

 

分享到:
评论
1 楼 梅花簪 2014-06-03  

相关推荐

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

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

    图形界面分析threadump_jstack分析工具_包含jdk

    “jdk”全称为Java Development Kit,是开发和运行Java应用程序所需的软件包,包括Java编译器、调试器和各种工具,如`jstack`。 压缩包子文件的文件名称列表中: - "jdk-8u144-linux-x64.tar.gz" 是Oracle JDK 8...

    JVM监控工具介绍jstack_jconsole_jinfo_jmap_jdb_jstat

    jstack是一款命令行工具,用于生成Java应用程序的崩溃dump文件的信息。该工具可以attach到正在运行的Java应用程序中,查看当前运行的Java应用程序的Java Stack和Native Stack的信息。如果当前运行的Java应用程序呈现...

    JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jstat.doc

    `jstack` 是一个强大的工具,用于获取Java应用的线程堆栈信息。当Java程序出现异常或挂起时,`jstack` 可以帮助分析程序状态,找出导致问题的代码位置。它不仅能读取当前运行进程的堆栈信息,还能解析由程序崩溃时...

    JStack和Java Thread Dumps分析

    通过对`JStack`工具的介绍及其在实际案例中的应用,我们可以看出,它是一种非常强大的调试工具。利用`JStack`,开发人员能够快速定位多线程问题,并深入理解程序的行为。无论是处理死锁还是监控线程状态,`JStack`都...

    【转】Java内存泄露_JVM监控工具介绍jstack_jconsole_jinfo_jmap_jdb_jstat

    总的来说,这些工具为Java开发者提供了一套全面的诊断和监控手段,能够有效地帮助我们理解和优化Java应用程序的性能,防止和解决内存泄露问题。在实际开发中,结合使用这些工具可以极大地提升我们的工作效率和系统的...

    java自带的工具Jstack截取进程中的堆栈信息

    Jstack工具非常实用,尤其是在远程服务器上进行故障诊断时,无需额外的调试工具或复杂的配置。只需有JDK和基本的命令行知识,就可以利用Jstack快速定位问题。此外,Jstack生成的线程堆栈信息也可以作为系统性能监控...

    java排障工具

    例如,Psexec允许开发者在远程计算机上执行命令,这对于跨服务器调试或者监控远程Java应用程序的状态非常有帮助。而Psinfo和Pslist则可以帮助我们了解服务器资源的使用情况,找出可能影响Java应用性能的因素。 接...

    Java 命令行以及Java工具总结

    JDK提供的命令行工具是Java开发者不可或缺的助手,它们不仅在开发过程中提供了便捷的调试和代码管理功能,而且在部署和监控Java应用程序时也至关重要。熟练掌握这些工具将有助于提高开发效率和应用的稳定性。

    Java内存泄露_JVM监控工具介绍

    jdb命令是一个强大的调试工具,用于对core文件和正在运行的Java进程进行实时地调试。jdb工具可以帮助开发者快速地定位问题所在,并提供丰富的命令帮助开发者进行调试。 六、jstat命令 jstat命令是一个实时的命令行...

    java线程分析工具TDA

    TDA作为一款开发工具,对于Java多线程的调试和优化具有极大的价值。通过其提供的详尽信息,开发者可以更好地理解线程间的交互,找出性能瓶颈,预防和解决并发问题,从而提高应用程序的稳定性和效率。 在实际开发中...

    JDK14性能管理工具之jstack使用介绍

    jstack能够提供关于线程状态和堆栈跟踪的详细视图,这对于理解Java应用的运行情况至关重要。 使用jstack时,它会向目标Java进程发送一个请求,以获取当前所有线程的堆栈跟踪信息。输出结果通常包括线程ID、线程状态...

    jvm工具、参数调优&调试技巧

    - **功能**:`jinfo` 允许用户查询和更改运行中的Java应用的系统属性。 - **常用操作**: - 查询属性:`jinfo -flag flagname pid`。 - 设置属性:`jinfo -flag flagname value pid`。 ##### 4. jhat:虚拟机堆...

    JDK自带调试工具doc

    3. `jconsole`:这是一个基于JMX(Java Management Extensions)的可视化管理工具,它提供了监控和管理Java应用程序的界面。通过`jconsole`,用户可以查看CPU使用率、内存消耗、线程状态、类加载情况等,同时还能...

    jdk安装包-java开发工具.rar

    例如,jconsole可以监控Java应用程序的资源使用情况,jmap用于生成堆转储文件以分析内存泄漏,jstack则用于查看线程堆栈信息,帮助定位死锁等问题。 除此之外,JDK还包含一个丰富的类库,如Java基础类库、集合框架...

    java jdk帮助工具

    11. **jstack线程堆栈跟踪工具**:显示Java应用程序中每个线程的堆栈跟踪,有助于诊断线程阻塞或死锁问题。 12. **jinfo配置信息工具**:获取和修改Java进程的配置信息,如系统属性和命令行选项。 13. **jvisualvm...

    java开发工具1.8

    4. **开发者工具**:JDK附带了一套开发者工具,如JConsole(用于监控Java应用的性能)、JVisualVM(多合一的Java应用性能分析工具)、javadoc(生成API文档)和jstack(用于查看线程堆栈跟踪)等。 5. **Java版本**...

    Troubleshooting Guide for Java

    ### Java调试指南:详解关键调试工具与方法 #### 概述 本文档旨在提供一份全面且深入的Java应用问题调试指南。随着Java平台标准版(Java Platform, Standard ...希望本文能够为您的Java应用调试之路提供有价值的参考。

    亲测可用java-1.8.0-openjdk.linux.x86_64.zip

    它包含了编译、调试和测试Java应用程序所需的全部工具。开发包通常会包含JDK中的核心组件,如Java编译器(javac)、Java虚拟机(JVM)、Java运行时环境(JRE)以及开发工具,例如Javadoc(生成API文档)和JAR(打包...

    java程序开发工具集的使用共1页.pdf.zip

    JDK包含了一组开发和调试Java应用程序所需的工具,如Java编译器(javac)、Java虚拟机(JVM)、Java文档生成器(javadoc)以及各种诊断和性能监控工具。 1. **Java编译器(javac)**:这是Java程序员最常使用的工具...

Global site tag (gtag.js) - Google Analytics