• 你将如何使用 thread dump?你将如何分析 Thread dump?


    新建状态(New)

    用 new 语句创建的线程处于新建状态,此时它和其他 Java 对象一样,仅仅在堆区

    中被分配了内存。

    就绪状态(Runnable)

    当一个线程对象创建后,其他线程调用它的 start()方法,该线程就进入就绪状态,

    Java 虚拟机会为它创建方法调用栈和程序计数器。处于这个状态的线程位于可运

    行池中,等待获得 CPU 的使用权。

    运行状态(Running)

    处于这个状态的线程占用 CPU,执行程序代码。只有处于就绪状态的线程才有机

    会转到运行状态。

    阻塞状态(Blocked)

    阻塞状态是指线程因为某些原因放弃 CPU,暂时停止运行。当线程处于阻塞状态

    时,Java 虚拟机不会给线程分配 CPU。直到线程重新进入就绪状态,它才有机会

    转到运行状态。

    阻塞状态可分为以下 3 种:

    位于对象等待池中的阻塞状态(Blocked in object’s wait pool)

    当线程处于运行状态时,如果执行了某个对象的 wait()方法,Java 虚拟机就会把

    线程放到这个对象的等待池中,这涉及到“线程通信”的内容。

    位于对象锁池中的阻塞状态(Blocked in object’s lock pool)

    当线程处于运行状态时,试图获得某个对象的同步锁时,如果该对象的同步锁已

    经被其他线程占用,Java 虚拟机就会把这个线程放到这个对象的锁池中,这涉及

    到“线程同步”的内容。

    其他阻塞状态(Otherwise Blocked)

    当前线程执行了 sleep()方法,或者调用了其他线程的 join()方法,或者发出了 I/O

    请求时,就会进入这个状态。

    死亡状态(Dead)

    当线程退出 run()方法时,就进入死亡状态,该线程结束生命周期。

    我们运行之前的那个死锁代码 SimpleDeadLock.java,然后尝试输出信息(

    /* 时间,jvm 信息 */

    2017-11-01 17:36:28

    Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.144-b01 mixed

    mode):

    /* 线程名称:DestroyJavaVM

    编号:#13

    优先级:5

    系统优先级:0

    jvm 内部线程 id:0x0000000001c88800

    对应系统线程 id(NativeThread ID):0x1c18

    线程状态: waiting on condition [0x0000000000000000] (等待某个条件)

    线程详细状态:java.lang.Thread.State: RUNNABLE 及之后所有*/

    "DestroyJavaVM" #13 prio=5 os_prio=0 tid=0x0000000001c88800

    nid=0x1c18 waiting on condition [0x0000000000000000]

    java.lang.Thread.State: RUNNABLE

    "Thread-1" #12 prio=5 os_prio=0 tid=0x0000000018d49000

    nid=0x17b8 waiting for monitor entry [0x0000000019d7f000]

    /* 线程状态:阻塞(在对象同步上)

    代码位置:at

    com.leo.interview.SimpleDeadLock$B.run(SimpleDeadLock.java:56)

    等待锁:0x00000000d629b4d8

    已经获得锁:0x00000000d629b4e8*/

    java.lang.Thread.State: BLOCKED (on object monitor)

    at

    com.leo.interview.SimpleDeadLock$B.run(SimpleDeadLock.java:56)

    - waiting to lock <0x00000000d629b4d8> (a java.lang.Object)

    - locked <0x00000000d629b4e8> (a java.lang.Object)

    "Thread-0" #11 prio=5 os_prio=0 tid=0x0000000018d44000 nid=0x1ebc

    waiting for monitor entry [0x000000001907f000]

    java.lang.Thread.State: BLOCKED (on object monitor)

    at

    com.leo.interview.SimpleDeadLock$A.run(SimpleDeadLock.java:34)

    - waiting to lock <0x00000000d629b4e8> (a java.lang.Object)

    - locked <0x00000000d629b4d8> (a java.lang.Object)

    "Service Thread" #10 daemon prio=9 os_prio=0

    tid=0x0000000018ca5000 nid=0x1264 runnable [0x0000000000000000]

    java.lang.Thread.State: RUNNABLE

    "C1 CompilerThread2" #9 daemon prio=9 os_prio=2

    tid=0x0000000018c46000 nid=0xb8c waiting on condition

    [0x0000000000000000]

    java.lang.Thread.State: RUNNABLE

    "C2 CompilerThread1" #8 daemon prio=9 os_prio=2

    tid=0x0000000018be4800 nid=0x1db4 waiting on condition

    [0x0000000000000000]

    java.lang.Thread.State: RUNNABLE

    "C2 CompilerThread0" #7 daemon prio=9 os_prio=2

    tid=0x0000000018be3800 nid=0x810 waiting on condition

    [0x0000000000000000]

    java.lang.Thread.State: RUNNABLE

    "Monitor Ctrl-Break" #6 daemon prio=5 os_prio=0

    tid=0x0000000018bcc800 nid=0x1c24 runnable [0x00000000193ce000]

    java.lang.Thread.State: RUNNABLE

    at java.net.SocketInputStream.socketRead0(Native Method)

    at

    java.net.SocketInputStream.socketRead(SocketInputStream.java:116)

    at java.net.SocketInputStream.read(SocketInputStream.java:171)

    at java.net.SocketInputStream.read(SocketInputStream.java:141)

    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)

    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)

    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)

    - locked <0x00000000d632b928> (a java.io.InputStreamReader)

    at java.io.InputStreamReader.read(InputStreamReader.java:184)

    at java.io.BufferedReader.fill(BufferedReader.java:161)

    at java.io.BufferedReader.readLine(BufferedReader.java:324)

    - locked <0x00000000d632b928> (a java.io.InputStreamReader)

    at java.io.BufferedReader.readLine(BufferedReader.java:389)

    at

    com.intellij.rt.execution.application.AppMainV2$1.run(AppMainV2.java:6

    4)

    "Attach Listener" #5 daemon prio=5 os_prio=2

    tid=0x0000000017781800 nid=0x524 runnable [0x0000000000000000]

    java.lang.Thread.State: RUNNABLE

    "Signal Dispatcher" #4 daemon prio=9 os_prio=2

    tid=0x000000001778f800 nid=0x1b08 waiting on condition

    [0x0000000000000000]

    java.lang.Thread.State: RUNNABLE

    "Finalizer" #3 daemon prio=8 os_prio=1 tid=0x000000001776a800

    nid=0xdac in Object.wait() [0x0000000018b6f000]

    java.lang.Thread.State: WAITING (on object monitor)

    at java.lang.Object.wait(Native Method)

    - waiting on <0x00000000d6108ec8> (a

    java.lang.ref.ReferenceQueue$Lock)

    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)

    - locked <0x00000000d6108ec8> (a

    java.lang.ref.ReferenceQueue$Lock)

    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)

    at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)

    "Reference Handler" #2 daemon prio=10 os_prio=2

    tid=0x0000000017723800 nid=0x1670 in Object.wait()

    [0x00000000189ef000]

    java.lang.Thread.State: WAITING (on object monitor)

    at java.lang.Object.wait(Native Method)

    - waiting on <0x00000000d6106b68> (a

    java.lang.ref.Reference$Lock)

    at java.lang.Object.wait(Object.java:502)

    at java.lang.ref.Reference.tryHandlePending(Reference.java:191)

    - locked <0x00000000d6106b68> (a java.lang.ref.Reference$Lock)

    at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)

    "VM Thread" os_prio=2 tid=0x000000001771b800 nid=0x604 runnable

    "GC task thread#0 (ParallelGC)" os_prio=0 tid=0x0000000001c9d800

    nid=0x9f0 runnable

    "GC task thread#1 (ParallelGC)" os_prio=0 tid=0x0000000001c9f000

    nid=0x154c runnable

    "GC task thread#2 (ParallelGC)" os_prio=0 tid=0x0000000001ca0800

    nid=0xcd0 runnable

    "GC task thread#3 (ParallelGC)" os_prio=0 tid=0x0000000001ca2000

    nid=0x1e58 runnable

    "VM Periodic Task Thread" os_prio=2 tid=0x0000000018c5a000

    nid=0x1b58 waiting on condition

    JNI global references: 33

    /* 此处可以看待死锁的相关信息! */

    Found one Java-level deadlock:

    =============================

    "Thread-1":

    waiting to lock monitor 0x0000000017729fc8 (object

    0x00000000d629b4d8, a java.lang.Object),

    which is held by "Thread-0"

    "Thread-0":

    waiting to lock monitor 0x0000000017727738 (object

    0x00000000d629b4e8, a java.lang.Object),

    which is held by "Thread-1"

    Java stack information for the threads listed above:

    ==============================================

    =====

    "Thread-1":

    at

    com.leo.interview.SimpleDeadLock$B.run(SimpleDeadLock.java:56)

    - waiting to lock <0x00000000d629b4d8> (a java.lang.Object)

    - locked <0x00000000d629b4e8> (a java.lang.Object)

    "Thread-0":

    at

    com.leo.interview.SimpleDeadLock$A.run(SimpleDeadLock.java:34)

    - waiting to lock <0x00000000d629b4e8> (a java.lang.Object)

    - locked <0x00000000d629b4d8> (a java.lang.Object)

    Found 1 deadlock.

    /* 内存使用状况,详情得看 JVM 方面的书 */

    Heap

    PSYoungGen

    total 37888K, used 4590K [0x00000000d6100000,

    0x00000000d8b00000, 0x0000000100000000)

    eden space 32768K, 14% used

    [0x00000000d6100000,0x00000000d657b968,0x00000000d8100000)

    from space 5120K, 0% used

    [0x00000000d8600000,0x00000000d8600000,0x00000000d8b00000)

    to

    space 5120K, 0% used

    [0x00000000d8100000,0x00000000d8100000,0x00000000d8600000)

    ParOldGen

    total 86016K, used 0K [0x0000000082200000,

    0x0000000087600000, 0x00000000d6100000)

    object space 86016K, 0% used

    [0x0000000082200000,0x0000000082200000,0x0000000087600000)

    Metaspace

    used 3474K, capacity 4500K, committed 4864K,

    reserved 1056768K

    class space

    used 382K, capacity 388K, committed 512K, reserved

    1048576K

  • 相关阅读:
    转: IOS程序内发短信 MFMessageComposeViewController
    对象之间如何比较是否相等?
    相比xib 使用代码编排view 的一个明显的好处就是可以更好地重复使用已有代码,减少代码冗余。
    关于deselectRowAtIndexPath
    IOS中为tableViewCell增加右侧标记(选中或者更多)
    ios 中是否每一个对象(尤其是在使用多线程时),都要判断一下对象是否为nil,以防止程序闪退?
    模拟出ios中流行的黑色背景底
    转 ios给view设置圆角
    转 UIAlertView 不显示、屏幕变灰
    转 UIActivityIndicatorView、UIProgressView 活动与进度指示器-IOS开发
  • 原文地址:https://www.cnblogs.com/programb/p/13020270.html
Copyright © 2020-2023  润新知