新建状态(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

你将如何使用 thread dump?你将如何分析 Thread dump?的更多相关文章

  1. TDA - Thread Dump Analyzer (Java线程分析工具)

    TDA - Thread Dump Analyzer (Java线程分析工具)http://automationqa.com/forum.php?mod=viewthread&tid=2351 ...

  2. ORACLE实例恢复过程详细分析--使用dump、BBED等多种工具结合分析

    ---友情提示,内容较多,可以从博文左上的+目录选择小节方便阅读.  实验思路:  --实验相关TRACE文件:http://download.csdn.net/detail/q947817003/6 ...

  3. [转]java线程安全、jstack\线程dump、内存查看分析总结

    http://jameswxx.iteye.com/blog/808546 java线程安全总结二 http://jameswxx.iteye.com/blog/1041173 jstack和线程du ...

  4. dump net core lldb 分析

    原文https://www.cnblogs.com/calvinK/p/9274239.html centos7 lldb 调试netcore应用的内存泄漏和死循环示例(dump文件调试) 写个dem ...

  5. 【转】php Thread Safe(线程安全)和None Thread Safe(NTS,非 线程安全)之分

    Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分,这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍. ...

  6. Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分

    Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分,这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍. ...

  7. 14.4.8 Configuring the InnoDB Master Thread IO Rate 配置InnoDB Master Thread I/O Rate

    14.4.8 Configuring the InnoDB Master Thread IO Rate 配置InnoDB Master Thread I/O Rate 主的master thread ...

  8. Handler Thread 内部类引起内存泄露分析

    非静态内部类引起内存泄漏的原因 内部类的实现其实是通过编译器的语法糖(Syntactic sugar)实现的,通过生成相应的子类即以OutClassName$InteriorClassName命名的C ...

  9. <实战> 通过分析Heap Dump 来了解 Memory Leak ,Retained Heap,Shallow Heap

    引入: 最近在和别的团队的技术人员聊天,发现很多人对于堆的基本知识都不太熟悉,所以他们不能很好的检测出memory leak问题,这里就用一个专题来讲解如何通过分析heap dump文件来查找memo ...

  10. 002-线程实现方式【thread、runnable、callale、thread和runnable对比】

    一.概述 1.实现方式 在java中对于多线程实现一定要有一个线程的主类,而这个线程的主类往往是需要操作一些资源,但是对于多线程主类的实现是: 继承Thread父类 从java的Thread类继承实现 ...

随机推荐

  1. ContOS 7安装Docker使用及部署MySQL和Nginx

    此文章采取狂神说Java https://space.bilibili.com/95256449 Docker学习网址: Docker官网:https://www.docker.com/ Docker ...

  2. 基于COCO数据集验证的目标检测算法天梯排行榜

    基于COCO数据集验证的目标检测算法天梯排行榜 AP50 Rank Model box AP AP50 Paper Code Result Year Tags 1 SwinV2-G (HTC++) 6 ...

  3. 量化研究之“大A打板敢死队”是如何做换手板与撬板的?

    更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 涨停跌停板分类 涨停.跌停是A股特有的现象,其他主要市场,例如美股.港股都不存在涨跌停的规则.涨停.跌停 ...

  4. jvm添加jmx远程监控

    调JVM监控的时候需要远程连接机器,所以服务器需要开放JMX协议,配置如下. 现在我的项目是jboot-jfinal项目,用的是undertow容器,在启动脚本里面加入 JAVA_OPTS=" ...

  5. YUV相关积累

    关于yuv 格式-Semi Planar和Planar https://www.cnblogs.com/welen/articles/5454315.html

  6. MM32F0020 UART1中断接收

    目录: 1.MM32F0020简介 2.初始化MM32F0020 UART1和NVIC中断 3.编写MM32F0020 UART1中断接收函数 4.编写MM32F0020 UART1发送字节和ASCI ...

  7. Spring源码解析之八finishBeanFactoryInitialization方法即初始化单例bean

    Spring源码解析之八finishBeanFactoryInitialization方法即初始化单例bean 七千字长文深刻解读,Spirng中是如何初始化单例bean的,和面试中最常问的Sprin ...

  8. SQL从零到迅速精通【实用函数(3)】

    1.LOWER()函数 使用LOWER函数将字符串中所有字幕字符转换为小写,输入语句如下. SELECT LOWER('BEAUTIFUL'),LOWER('Well'); 2.UPPER()函数 S ...

  9. Laravel-Auth认证

    1.建立数据表 admins 2.找到config下的auth.php 文件,加入如下代码 <?php return [ /* |-------------------------------- ...

  10. php 23种设计模式 - 责任链模式

    责任链模式 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行 ...