新建状态(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. WPF使用MVVM(三)-事件转命令

    WPF使用MVVM(三)-事件转命令 上一节介绍了WPF中的命令,可是仅仅介绍的是WPF框架给我们提供的点击命令,也就是用Command属性来绑定一个命令,用来响应按钮的点击行为!显然这是不够的,界面 ...

  2. 【C# 线程】interLocked锁

    overview 同步基元分为用户模式和内核模式 用户模式:Iterlocked.Exchange(互锁).SpinLocked(自旋锁).易变构造(volatile关键字.volatile类.Thr ...

  3. oracle 12c RAC 重启

    转至:https://blog.csdn.net/weixin_40283570/article/details/81511072 关闭顺序 :关闭PDB----->关闭数据库------> ...

  4. Java课程设计---项目数据库设计(含实体类)

    1.表设计 (1)新建表tb_student(学生表) (2)新建表tb_admin(管理员表) (3)新建表tb_teacher(教师表) (4)新建表tb_course(课程表) (5)新建表tb ...

  5. 惨,给Go提的代码被批麻了

    hello大家好,我是小楼. 不知道大家还记不记得我上次找到了一个Go的Benchmark执行会超时的Bug?就是这篇文章<我好像发现了一个Go的Bug?>. 之后我就向Go提交了一个PR ...

  6. LeetCode-086-分隔链表

    分隔链表 题目描述:给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前. 你应当 保留 两个分区中每个节点的初始相对 ...

  7. docker学习笔记(1)- 架构概述

    微服务架构 微服务VS传统分层架构 传统分层架构 优点 对于简单系统: 容易部署 容易测试 容易横向扩展 缺点 对于复杂系统: 耦合度高 不易快速维护 启动慢,部署慢 模块变更引起的回归问题多 难以持 ...

  8. CSAPP-Lab03 Attack Lab 记录

    纸上得来终觉浅,绝知此事要躬行 实验概览 Attack!成为一名黑客不正是我小时候的梦想吗?这个实验一定会很有趣. CMU 对本实验的官方说明文档:http://csapp.cs.cmu.edu/3e ...

  9. JQ,JQuery的ajax卡住了,浏览器页面卡住

    在使用ajax的时候浏览器卡住了, 经过测试是因为在ajax中使用的data数据变量写错了 不存在也不报错,直接卡主了 好好检查一下吧.

  10. 《前端运维》一、Linux基础--06Shell流程控制

    这章我们来学习下流程控制,简单来说就是逻辑判断和循环的写法.并不复杂,我们来简单地看下. 1.if语句 shell的if语句有两种写法,一种是shell脚本式的,一种是命令式的. if conditi ...