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>

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

  • 相关阅读:
    PyCharm 自定义文件和代码模板
    Django 1.10中文文档-第一个应用Part6-静态文件
    Django 1.10中文文档-第一个应用Part5-测试
    Python标准库笔记(4) — collections模块
    Python标准库笔记(3) — datetime模块
    Django 1.10中文文档-第一个应用Part4-表单和通用视图
    Python爬虫—破解JS加密的Cookie
    Python标准库笔记(2) — re模块
    算法"新"名词
    MLP神经网络实例--手写识别
  • 原文地址:https://www.cnblogs.com/hushaojun/p/4324031.html
Copyright © 2011-2022 走看看