zoukankan      html  css  js  c++  java
  • JAVA线程dump的分析

    Java 的线程

    线程是指能独立于程序的其它部分运行的执行单元。 JAVA语言能够很好的实现多线程的程序。我们在调试程序,或者在开发后期需要做性能调优的时候,往往也需要了解当前程序正在运行的线程的状态,正在执行的操作,从而分析系统可能存在的问题。

    在阅读本文之间,应对 Java线程的编程原理,同步机制有一定了解 .

    产生 JAVA线程 dump

    JAVA 的线程 DUMP,就象当前 JAVA进程的一个快照,打印出所有线程的状态和调用堆栈,以及 Monitor的状态。在不同的操作系统下,产生线程 DUMP的方式是不同的。

    ·在 windows环境中,

    在启动程序的控制台里敲: Ctrl - Break,线程的 dump会产生在标准输出中(缺省标准输出就是控制台,如果对输出进行了重定向,则要查看输出文件)。

    在 unix, linux和 MacOS 环境中,

    在控制台中敲: Ctrl-,或者,

    用 “kill -3 <pid>” ,或者 “kill – QUIT <pid>”。 Pid是用所关注的 JAVA进程号,您可以用 “ps -ef | grep java” 找到,或者使用 JDK 5.0中的 “jps -v” 命令获得。

    在各个操作系统平台,都可以用 JDK 5.0工具包中的 jstack <pid>

    这里要注意的是:

    1.     不同的 JAVA虚机的线程 DUMP的创建方法和文件格式是不一样的,不同的 JVM版本, dump信息也有差别。本文中,只以 SUN的 hotspot JVM 5.0_06 为例。

    2.     在实际运行中,往往一次 dump的信息,还不足以确认问题。建议产生三次 dump信息,如果每次 dump都指向同一个问题,我们才确定问题的典型性。

    线程分析 :

    1.     JVM 线程

    在线程中,有一些 JVM内部的后台线程,来执行譬如垃圾回收,或者低内存的检测等等任务,这些线程往往在 JVM初始化的时候就存在,如下所示:

    "Low Memory Detector" daemon prio=10 tid=0x081465f8 nid=0x7 runnable [0x00000000..0x00000000]
    "CompilerThread0" daemon prio=10 tid=0x08143c58 nid=0x6 waiting on condition [0x00000000..0xfb5fd798]
    "Signal Dispatcher" daemon prio=10 tid=0x08142f08 nid=0x5 waiting on condition [0x00000000..0x00000000]
    "Finalizer" daemon prio=10 tid=0x08137ca0 nid=0x4 in Object.wait() [0xfbeed000..0xfbeeddb8]
    at java.lang.Object.wait(Native Method)
    - waiting on <0xef600848> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)
    - locked <0xef600848> (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=0x081370f0 nid=0x3 in Object.wait() [0xfbf4a000..0xfbf4aa38]
    at java.lang.Object.wait(Native Method)
    - waiting on <0xef600758> (a java.lang.ref.Reference$Lock)
    at java.lang.Object.wait(Object.java:474)
    at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
    - locked <0xef600758> (a java.lang.ref.Reference$Lock)
    "VM Thread" prio=10 tid=0x08134878 nid=0x2 runnable
    "VM Periodic Task Thread" prio=10 tid=0x08147768 nid=0x8 waiting on condition

    我们更多的是要观察用户级别的线程,如下所示:

    "Thread-1" prio=10 tid=0x08223860 nid=0xa waiting on condition [0xef47a000..0xef47ac38]
    at java.lang.Thread.sleep(Native Method)
    at testthread.MySleepingThread.method2(MySleepingThread.java:53)
    - locked <0xef63d600> (a testthread.MySleepingThread)
    at testthread.MySleepingThread.run(MySleepingThread.java:35)
    at java.lang.Thread.run(Thread.java:595)

    我们能看到:

    线程的状态: waiting on condition

    线程的调用栈

    线程的当前锁住的资源: <0xef63d600>

    这些信息对我们随后的分析都有用处。

  • 相关阅读:
    Vue.js中使用iView日期选择器并设置开始时间结束时间校验
    侠客行
    myJRebel 已不可用
    开发.NET Core NuGet包并实现CI/CD
    独立部署GeoWebCache
    GeoServer中GeoWebCache(GWC)的使用
    使用VS Code编写Markdown文件
    GitHub团队协作流程
    打包发布到NPM并通过CDN访问
    使用VS Code编写Markdown文件
  • 原文地址:https://www.cnblogs.com/hushaojun/p/4324031.html
Copyright © 2011-2022 走看看