新建状态(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. Smartbi实践:制作可视化分析报表的感悟

    ​估计看到这篇文章的朋友,都是有使用过Smartbi制作数据可视化图表的.但是不是制作过程跟制作效果并没有让自己那么满意.使用过程也经常遇到一些问题解决不了?那是因为你使用的方法不对.你是否在使用Sm ...

  2. 年底获奖人太多?奖状可以用Smartbi电子表格这么做!

    又到一年年终时,你的年终奖到手了吗?奖金没领到,发个奖状压压惊 今天给大家分享年终奖相关的年终奖状的批量套打功能,保证你的奖状及时到手! 示例说明 现有多个人员的奖励需要通知,需要生成可翻页的奖状.并 ...

  3. 【CPU】进程管理之五状态模型

    本文为第三篇,进程管理之五状态模型,进程在操作系统里边是有多个状态的,本文就是了解进程在操作系统中的多个状态 1.进程的五个状态 创建状态 就绪状态 阻塞状态 执行状态 终止状态 2.进程处于这五种状 ...

  4. MSBuild 和项目文件

    Microsoft 生成引擎(MSBuild)项目文件位于生成和部署过程的核心. 本主题以 MSBuild 和项目文件的概念性概述开头. 它介绍了在处理项目文件时将遇到的关键组件,并通过一个示例来演示 ...

  5. Linux中查看进程与日志

    转至:https://www.cnblogs.com/dengxiaoning/p/13336778.html Linux尽管使用频繁,仍然每次都还是需要到处去找相关的命令,如进程,日志之类的,既然这 ...

  6. Git如何使用,操作流程

    官方示例 git config --global user.name "sanqianll" git config --global user.email "224001 ...

  7. unittest简介01

    前言 熟悉java的应该都清楚常见的单元测试框架Junit和TestNG,python里面也有单元测试框架-unittest,相当于是一个python版的junit. 一.unittest简介 1.先 ...

  8. 【AIA】培训感悟

    最主要一个感悟,有钱了一定要买香港的保险.存个100万,年薪30就行,先把这个做目标.

  9. laravel框架简易增删(改)查

    // 设置路由//展示表单页面Route::get('/week/add','weekController@add');//添加Route::post('/week/insert','weekCont ...

  10. joblib保存模型和joblib的并行化处理和tqdm

    keep首先是默认first