新建状态(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. 2020年最为典型的BI工具有哪些?

    现在可视化BI 可以帮助充分利用企业在日常运营中积累的大量数据,帮助企业做出理性的决策,降低风险,减少损失.以下五款我认为是2020年最为典型的BI工具: (1)Tableau Tableau是国外市 ...

  2. prometheus k8s服务发现

    Prometheus的服务发现在解决什么问题? 被监控的目标(target)是整个监控体系中重要组成部分,传统监控系统zabbix通过 网络发现的机制自动创建主机到zabbix-server,进而快速 ...

  3. Vue 源码解读(9)—— 编译器 之 优化

    前言 上一篇文章 Vue 源码解读(8)-- 编译器 之 解析 详细详解了编译器的第一部分,如何将 html 模版字符串编译成 AST.今天带来编译器的第二部分,优化 AST,也是大家常说的静态标记. ...

  4. xls/csv文件转换成dbf文件

    转至:https://blog.csdn.net/linhai1028/article/details/80211252 编写的一个小脚本,主要是利用python中的pandas,xlrd,dbfpy ...

  5. ScrollView垂直滚动和HrizontalScrollView水平滚动

    当我们在写一个页面,内容过多时我们需要滚动页面来查看,但是注意ScrollView下只能有一个元素,所以要把主页面改下,这样就只有一个LinearLayout元素: 1 <ScrollView ...

  6. Qt:QJsonArray

    0.说明 QJsonArray中存储了一系列的QJsonValue.可以向其中插入.删除QJsonValue. 一个QJsonArray可以与QVariantList互相转换.可以通过size()访问 ...

  7. Leaflet:LayerGroup、FeatureGroup

    LayerGroup(Layer) Layer 用法:把一些Layer集中到一个组Group中,以便作为一个整体进行操作.如果把该Group加入到了Map中,任何从这个Group增加或者移除Layer ...

  8. C#-使用HttpListener创建http服务

    参考: c# 通过HttpListener创建HTTP服务 运行服务端程序,启动监听器httpobj.Start();时报错:System.Net.HttpListenerException: 'Ac ...

  9. SpringBoot连接Redis (Sentinel模式&Cluster模式)

    一.引入pom <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  10. tp 七牛云文件上传

    1.先创建好七牛云账号和存储空间 申请七牛云账号: 创建七牛云存储空间: 在账号的秘钥管理里面创建秘钥 获取AccessKey / SecretKey: 2.集成PHP-SDK 七牛云开发文档:htt ...