一、thread dump信息获取
1、发送信号
* In Unix, use "kill -3 <pid>" where pid is the Process ID of the JVM.(kill 信号列表)
* In Windows, press CTRL+BREAK on the window where the JVM is running.
2、通过命令导出文本文件
jps -l 找出服务器上运行的Java进程
jstack -l pid  直接显示在屏幕上
jstack pid | tee -a jstack.log    导出堆栈文件
3、通过jdk工具jvisualvm,在界面上点击生成thread dump文件
二、分析thread dump信息
1、最上面的是时间和jvm的信息
2、各个线程thread信息
3、最后面是heap堆的信息

三、thread线程的原始状态和thread dump文件中线程状态的
1、thread线程的原始状态:
NEW:还没有调用start()方法开始执行,在thread dump中不会出现
RUNNABLE:正常在执行的线程
BLOCKED:阻塞状态,等待获取锁进入同步方法或者同步代码块
WAITING:调用wait(),join(),LockSupport.park()方法
TIMED_WAITING:调用wait(long),join(long),LockSupport.parkNanos,LockSupport.parkUntil方法,在指定时间内等待并且没有超时
TERMINATED:正常执行完的线程,在thread dump中不会出现
在thread dump中可能出现的thread线程的原始状态有:RUNNABLE,BLOCKED,WAITING,TIMED_WAITING

2、thread dump文件中线程状态的种类:
Runnable
sleeping
Waiting for monitor entry (重点关注)
Wait on condition(重点关注)
in Object.wait() (重点关注)
Deadlock(重点关注)
其中
thread的RUNNABLE对应---> Runnable
thread的BLOCKED对应---> Waiting for monitor entry 
thread的WAITING和TIMED_WAITING对应---> in Object.wait()和Wait on condition

四、Dump文件中的线程状态含义:
Deadlock:死锁线程,一般指多个线程调用间,进入相互资源占用,导致一直等待无法释放的情况。
Runnable:一般指该线程正在执行状态中,该线程占用了资源,正在处理某个请求,有可能正在传递SQL到数据库执行,有可能在对某个文件操作,有可能进行数据类型等转换。
Waiting on condition:等待资源,或等待某个条件的发生。具体原因需结合 stacktrace来分析。如果堆栈信息明确是应用代码,则证明该线程正在等待资源。一般是大量读取某资源,且该资源采用了资源锁的情况下,线程进入等待状态,等待资源的读取。又或者,正在等待其他线程的执行等。
如果发现有大量的线程都在处在 Wait on condition,从线程 stack看,正等待网络读写,这可能是一个网络瓶颈的征兆。因为网络阻塞导致线程无法执行。一种情况是网络非常忙,几乎消耗了所有的带宽,仍然有大量数据等待网络读写;
另一种情况也可能是网络空闲,但由于路由等问题,导致包无法正常的到达。
另外一种出现 Wait on condition的常见情况是该线程在 sleep,等待 sleep的时间到了时候,将被唤醒。
Blocked:线程阻塞,是指当前线程执行过程中,所需要的资源长时间等待却一直未能获取到,被容器的线程管理器标识为阻塞状态,可以理解为等待资源超时的线程。
Waiting for monitor entry 和 in Object.wait():Monitor是 Java中用以实现线程之间的互斥与协作的主要手段,它可以看成是对象或者 Class的锁。
每一个对象都有,也仅有一个 monitor。每个 Monitor在某个时刻,只能被一个线程拥有,该线程就是 “Active Thread”,
而其它线程都是 “Waiting Thread”,分别在两个队列 “ Entry Set”和 “Wait Set”里面等候。
在 “Entry Set”中等待的线程状态是 “Waiting for monitor entry”,而在 “Wait Set”中等待的线程状态是 “in Object.wait()”。
在 “Entry Set”中的是试图获取锁而阻塞的线程;而“Wait Set”则是,获取锁后调用wait()而进入阻塞的线程,当其他线程调用notify()或者notifyall()唤醒等待该锁上的其他线程时,会把“Wait Set”队列中的
一个或者全部线程放入“Entry Set”中,然后在其中随机选择一个重新获取锁,然后执行。

一个阻塞状态线程的分析:

1. "Timer-0" daemon prio=10 tid=0xac190c00 nid=0xaef in Object.wait() [0xae77d000] 
2. java.lang.Thread.State: TIMED_WAITING (on object monitor) 
3. atjava.lang.Object.wait(Native Method) 
4. -waiting on <0xb3885f60> (a java.util.TaskQueue) ###继续wait 
5. atjava.util.TimerThread.mainLoop(Timer.java:509) 
6. -locked <0xb3885f60> (a java.util.TaskQueue) ###已经locked 
7. atjava.util.TimerThread.run(Timer.java:462)
* 线程名称:Timer-0 
* 线程类型:daemon 
* 优先级: 10,默认是5 
* jvm线程id:tid=0xac190c00,jvm内部线程的唯一标识(通过java.lang.Thread.getId()获取,通常用自增方式实现。) 
* 对应系统线程id(NativeThread ID):nid=0xaef,和top命令查看的线程pid对应,不过一个是10进制,一个是16进制。(通过命令:top -H -p pid,可以查看该进程的所有线程信息)
* 线程状态:in Object.wait(). 
* 起始栈地址:[0xae77d000] 
* Java thread statck trace:是上面2-7行的信息。到目前为止这是最重要的数据,Java stack trace提供了大部分信息来精确定位问题根源。(倒着看,入口在最下面一行)
JNI global references表示的意义?

五、案例分析
综合案例一:BLOCKED---waiting for monitor entry(deadlock)
综合案例二:BLOCKED---waiting for monitor entry(热点同步代码块造成的阻塞)
综合案例三:WAITING---(in Object.wait())(调用 object.wait()造成的)
综合案例四:TIMED_WAITING--- in Object.wait()(object.wait(1 * 60 * 1000)造成)
综合案例五:WAITING (parking)---waiting on condition(通过条件变量condition.await()造成)
综合案例六:TIMED_WAITING (parking)---waiting on condition(通过条件变量condition.await(5, TimeUnit.MINUTES)造成)
综合案例七:TIMED_WAITING---waiting on condition(Thread.sleep(1*60*1000)造成的)

综合案例一:BLOCKED---waiting for monitor entry(deadlock)

public class Test {public static void main(String[] args) throws Exception{System.out.println("主线程开始"+Thread.currentThread().getName());final LeftRightDeadLock lock = new LeftRightDeadLock();Thread t1 = new Thread(){@Overridepublic void run() {try {lock.leftRight();} catch (Exception e) {e.printStackTrace();}}};Thread t2 = new Thread(){@Overridepublic void run() {try {lock.rightLeft();} catch (Exception e) {e.printStackTrace();}}};t1.start();t2.start();t1.join();t2.join();System.out.println("主线程结束"+Thread.currentThread().getName());}
}
public class LeftRightDeadLock {private final Object left = new Object();private final Object right = new Object();public void leftRight() throws Exception {synchronized (left) {System.out.println(Thread.currentThread().getName()+"获得left锁");Thread.sleep(1000);synchronized (right){System.out.println("leftRight end!");}}}public void rightLeft() throws Exception {synchronized (right) {    System.out.println(Thread.currentThread().getName()+"获得right锁");Thread.sleep(1000);synchronized (left){System.out.println("rightLeft end!");}}}
}

thread dump信息:
"Thread-1" prio=6 tid=0x000000000c019000 nid=0x2f38 waiting for monitor entry [0x000000000d14f000]
java.lang.Thread.State: BLOCKED (on object monitor)
at ls.lock.LeftRightDeadLock.rightLeft(LeftRightDeadLock.java:32)
- waiting to lock <0x00000000d7d53bb8> (a java.lang.Object)
- locked <0x00000000d7d53bc8> (a java.lang.Object)
at ls.lock.Test$2.run(Test.java:26)

"Thread-0" prio=6 tid=0x000000000c018000 nid=0x3de0 waiting for monitor entry [0x000000000cddf000]
java.lang.Thread.State: BLOCKED (on object monitor)
at ls.lock.LeftRightDeadLock.leftRight(LeftRightDeadLock.java:20)
- waiting to lock <0x00000000d7d53bc8> (a java.lang.Object)
- locked <0x00000000d7d53bb8> (a java.lang.Object)
at ls.lock.Test$1.run(Test.java:16)

Found one Java-level deadlock:
=============================
"Thread-1":
waiting to lock monitor 0x000000000aa87f58 (object 0x00000000d7d53bb8, a java.lang.Object),
which is held by "Thread-0"
"Thread-0":
waiting to lock monitor 0x000000000c01ad08 (object 0x00000000d7d53bc8, a java.lang.Object),
which is held by "Thread-1"

综合案例二:BLOCKED---waiting for monitor entry(热点同步代码块造成的阻塞)

public class BlockedState {private static Object object = new Object();public static void main(String[] args) {Runnable task = new Runnable() {@Overridepublic void run() {synchronized (object) {System.out.println("线程:" + Thread.currentThread().getName()+"获取锁");long begin = System.currentTimeMillis();long end = System.currentTimeMillis();// 让线程运行1分钟,会一直持有object的监视器while ((end - begin) <= 1 * 60 * 1000) {end = System.currentTimeMillis();}}}};new Thread(task, "t1").start();new Thread(task, "t2").start();}
}

thread dump信息:
"t2" prio=6 tid=0x000000000c389800 nid=0x3ee4 waiting for monitor entry [0x000000000cc6f000]
java.lang.Thread.State: BLOCKED (on object monitor)
at ls.lock.BlockedState$1.run(BlockedState.java:19)
- waiting to lock <0x00000000d7d4c460> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:744)

"t1" prio=6 tid=0x000000000c388800 nid=0x3d08 runnable [0x000000000cf0e000]
java.lang.Thread.State: RUNNABLE
at ls.lock.BlockedState$1.run(BlockedState.java:24)
- locked <0x00000000d7d4c460> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:744)

综合案例三:WAITING---(in Object.wait())(调用 object.wait()造成的)

public class WaitingState {private static Object object = new Object();public static void main(String[] args) {Runnable task = new Runnable() {@Overridepublic void run() {synchronized (object) {System.out.println("线程:" + Thread.currentThread().getName()+"获取锁");try {object.wait();} catch (InterruptedException e) {e.printStackTrace();}}}};new Thread(task, "t1").start();new Thread(task, "t2").start();}
}

thread dump信息:
"t2" prio=6 tid=0x000000000c379800 nid=0x3e28 in Object.wait() [0x000000000d06f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000000d7d4c4a0> (a java.lang.Object)
at java.lang.Object.wait(Object.java:503)
at ls.lock.WaitingState$1.run(WaitingState.java:29)
- locked <0x00000000d7d4c4a0> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:744)

"t1" prio=6 tid=0x000000000c375000 nid=0x3f54 in Object.wait() [0x000000000d18f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000000d7d4c4a0> (a java.lang.Object)
at java.lang.Object.wait(Object.java:503)
at ls.lock.WaitingState$1.run(WaitingState.java:29)
- locked <0x00000000d7d4c4a0> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:744)

综合案例四:TIMED_WAITING--- in Object.wait()(object.wait(1 * 60 * 1000)造成)

public class TimedWaitingState1 {private static Object object = new Object();public static void main(String[] args) {Runnable task = new Runnable() {@Overridepublic void run() {synchronized (object) {System.out.println("线程:" + Thread.currentThread().getName()+"获取锁");try {// 进入等待的同时,会进入释放监视器object.wait(1 * 60 * 1000);} catch (InterruptedException e) {e.printStackTrace();}}}};new Thread(task, "t1").start();new Thread(task, "t2").start();}
}

thread dump信息:
"t2" prio=6 tid=0x000000000c0e5000 nid=0x3788 in Object.wait() [0x000000000cf9f000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000000d7d4c978> (a java.lang.Object)
at ls.lock.TimedWaitingState1$1.run(TimedWaitingState1.java:26)
- locked <0x00000000d7d4c978> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:744)

"t1" prio=6 tid=0x000000000c0b9000 nid=0x31a8 in Object.wait() [0x000000000cddf000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000000d7d4c978> (a java.lang.Object)
at ls.lock.TimedWaitingState1$1.run(TimedWaitingState1.java:26)
- locked <0x00000000d7d4c978> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:744)

综合案例五:WAITING (parking)---waiting on condition(通过条件变量condition.await()造成)

public class TimedWaitingState3 {// java的显示锁,类似java对象内置的监视器private static Lock lock = new ReentrantLock();// 锁关联的条件队列(类似于object.wait)private static Condition condition = lock.newCondition();public static void main(String[] args) {Runnable task = new Runnable() {@Overridepublic void run() {// 加锁,进入临界区lock.lock();System.out.println("线程:" + Thread.currentThread().getName()+"获取锁");try {condition.await();} catch (InterruptedException e) {e.printStackTrace();}// 解锁,退出临界区lock.unlock();}};new Thread(task, "t1").start();new Thread(task, "t2").start();}
}

thread dump信息:
"t2" prio=6 tid=0x000000000c3ae800 nid=0x3f1c waiting on condition [0x000000000d03f000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for  <0x00000000d7d4ef90> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at ls.lock.TimedWaitingState3$1.run(TimedWaitingState3.java:51)
at java.lang.Thread.run(Thread.java:744)

"t1" prio=6 tid=0x000000000c3ad800 nid=0x36a4 waiting on condition [0x000000000cdbe000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for  <0x00000000d7d4ef90> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at ls.lock.TimedWaitingState3$1.run(TimedWaitingState3.java:51)
at java.lang.Thread.run(Thread.java:744)

综合案例六:TIMED_WAITING (parking)---waiting on condition(通过条件变量condition.await(5, TimeUnit.MINUTES)造成)

public class TimedWaitingState {// java的显示锁,类似java对象内置的监视器private static Lock lock = new ReentrantLock();// 锁关联的条件队列(类似于object.wait)private static Condition condition = lock.newCondition();public static void main(String[] args) {Runnable task = new Runnable() {@Overridepublic void run() {// 加锁,进入临界区lock.lock();System.out.println("线程:" + Thread.currentThread().getName()+"获取锁");try {condition.await(5, TimeUnit.MINUTES);} catch (InterruptedException e) {e.printStackTrace();}// 解锁,退出临界区lock.unlock();}};new Thread(task, "t1").start();new Thread(task, "t2").start();}
}

thread dump信息:
"t2" prio=6 tid=0x000000000c321000 nid=0x3bb4 waiting on condition [0x000000000d28f000]
java.lang.Thread.State: TIMED_WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for  <0x00000000d7d4ed18> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:226)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2176)
at ls.lock.TimedWaitingState$1.run(TimedWaitingState.java:31)
at java.lang.Thread.run(Thread.java:744)

"t1" prio=6 tid=0x000000000c320800 nid=0x3d64 waiting on condition [0x000000000d05e000]
java.lang.Thread.State: TIMED_WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for  <0x00000000d7d4ed18> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:226)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2176)
at ls.lock.TimedWaitingState$1.run(TimedWaitingState.java:31)
at java.lang.Thread.run(Thread.java:744)

综合案例七:TIMED_WAITING---waiting on condition(Thread.sleep(1*60*1000)造成的)

public class TimedWaitingState2 {public static void main(String[] args) {Runnable task = new Runnable() {@Overridepublic void run() {System.out.println("线程:" + Thread.currentThread().getName()+"获取锁");try {Thread.sleep(1*60*1000);} catch (InterruptedException e) {e.printStackTrace();}}};new Thread(task, "t1").start();new Thread(task, "t2").start();}
}

thread dump信息:
"t2" prio=6 tid=0x000000000c632000 nid=0x3f14 waiting on condition [0x000000000d20f000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at ls.lock.WaitOnCondition$1.run(WaitOnCondition.java:17)
at java.lang.Thread.run(Thread.java:744)

"t1" prio=6 tid=0x000000000c551000 nid=0xae8 waiting on condition [0x000000000d07e000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at ls.lock.WaitOnCondition$1.run(WaitOnCondition.java:17)
at java.lang.Thread.run(Thread.java:744)

附录:

死锁测试代码

public class LeftRightDeadLock
{private final Object left = new Object();private final Object right = new Object();public void leftRight() throws Exception{synchronized (left){System.out.println(Thread.currentThread().getName()+"获得left锁");Thread.sleep(1000);synchronized (right){System.out.println("leftRight end!");}}}public void rightLeft() throws Exception{synchronized (right){    System.out.println(Thread.currentThread().getName()+"获得right锁");Thread.sleep(1000);synchronized (left){System.out.println("rightLeft end!");}}}
}
public class Test {public static void main(String[] args) throws Exception{System.out.println("主线程开始"+Thread.currentThread().getName());final LeftRightDeadLock lock = new LeftRightDeadLock();Thread t1 = new Thread(){@Overridepublic void run() {try {lock.leftRight();} catch (Exception e) {e.printStackTrace();}}};Thread t2 = new Thread(){@Overridepublic void run() {try {lock.rightLeft();} catch (Exception e) {e.printStackTrace();}}};t1.start();t2.start();t1.join();t2.join();System.out.println("主线程结束"+Thread.currentThread().getName());}
}

程序运行输出:

主线程开始main
Thread-1获得right锁
Thread-0获得left锁

thread dump文件

2018-07-30 16:24:06
Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.51-b03 mixed mode):"Thread-1" prio=6 tid=0x000000000c4ee000 nid=0x2ffc waiting for monitor entry [0x000000000d0ef000]java.lang.Thread.State: BLOCKED (on object monitor)at ls.lock.LeftRightDeadLock.rightLeft(LeftRightDeadLock.java:32)- waiting to lock <0x00000000d7d53ca8> (a java.lang.Object)- locked <0x00000000d7d53cb8> (a java.lang.Object)at ls.lock.Test$2.run(Test.java:25)"Thread-0" prio=6 tid=0x000000000c4ed800 nid=0x46f0 waiting for monitor entry [0x000000000d21f000]java.lang.Thread.State: BLOCKED (on object monitor)at ls.lock.LeftRightDeadLock.leftRight(LeftRightDeadLock.java:20)- waiting to lock <0x00000000d7d53cb8> (a java.lang.Object)- locked <0x00000000d7d53ca8> (a java.lang.Object)at ls.lock.Test$1.run(Test.java:15)"Service Thread" daemon prio=6 tid=0x000000000c3c9800 nid=0x31a0 runnable [0x0000000000000000]java.lang.Thread.State: RUNNABLE"C2 CompilerThread1" daemon prio=10 tid=0x000000000c3c8800 nid=0x430c waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLE"C2 CompilerThread0" daemon prio=10 tid=0x000000000c3c7800 nid=0x2a48 waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLE"Monitor Ctrl-Break" daemon prio=6 tid=0x000000000c3bf800 nid=0x48ac runnable [0x000000000c95f000]java.lang.Thread.State: RUNNABLEat java.net.SocketInputStream.socketRead0(Native Method)at java.net.SocketInputStream.read(SocketInputStream.java:152)at java.net.SocketInputStream.read(SocketInputStream.java:122)at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)- locked <0x00000000d7e12a50> (a java.io.InputStreamReader)at java.io.InputStreamReader.read(InputStreamReader.java:184)at java.io.BufferedReader.fill(BufferedReader.java:154)at java.io.BufferedReader.readLine(BufferedReader.java:317)- locked <0x00000000d7e12a50> (a java.io.InputStreamReader)at java.io.BufferedReader.readLine(BufferedReader.java:382)at com.intellij.rt.execution.application.AppMainV2$1.run(AppMainV2.java:64)"Attach Listener" daemon prio=10 tid=0x000000000ac3f800 nid=0x3e48 runnable [0x0000000000000000]java.lang.Thread.State: RUNNABLE"Signal Dispatcher" daemon prio=10 tid=0x000000000abda000 nid=0x3a20 waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLE"Finalizer" daemon prio=8 tid=0x000000000abc2800 nid=0x31f0 in Object.wait() [0x000000000bb8f000]java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x00000000d7c05568> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)- locked <0x00000000d7c05568> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:189)"Reference Handler" daemon prio=10 tid=0x000000000abbf000 nid=0x2354 in Object.wait() [0x000000000beaf000]java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x00000000d7c050f0> (a java.lang.ref.Reference$Lock)at java.lang.Object.wait(Object.java:503)at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)- locked <0x00000000d7c050f0> (a java.lang.ref.Reference$Lock)"main" prio=6 tid=0x00000000024e9000 nid=0x48dc in Object.wait() [0x00000000029cf000]java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x00000000d7d53cc8> (a ls.lock.Test$1)at java.lang.Thread.join(Thread.java:1280)- locked <0x00000000d7d53cc8> (a ls.lock.Test$1)at java.lang.Thread.join(Thread.java:1354)at ls.lock.Test.main(Test.java:34)"VM Thread" prio=10 tid=0x000000000abbd800 nid=0x40e8 runnable "GC task thread#0 (ParallelGC)" prio=6 tid=0x00000000024ff000 nid=0x40c0 runnable "GC task thread#1 (ParallelGC)" prio=6 tid=0x0000000002501000 nid=0x4064 runnable "GC task thread#2 (ParallelGC)" prio=6 tid=0x0000000002502800 nid=0x437c runnable "GC task thread#3 (ParallelGC)" prio=6 tid=0x0000000002504800 nid=0x1270 runnable "VM Periodic Task Thread" prio=10 tid=0x000000000c3cd800 nid=0x34d4 waiting on condition JNI global references: 127Found one Java-level deadlock:
=============================
"Thread-1":waiting to lock monitor 0x000000000c4eff28 (object 0x00000000d7d53ca8, a java.lang.Object),which is held by "Thread-0"
"Thread-0":waiting to lock monitor 0x000000000abc96e8 (object 0x00000000d7d53cb8, a java.lang.Object),which is held by "Thread-1"Java stack information for the threads listed above:
===================================================
"Thread-1":at ls.lock.LeftRightDeadLock.rightLeft(LeftRightDeadLock.java:32)- waiting to lock <0x00000000d7d53ca8> (a java.lang.Object)- locked <0x00000000d7d53cb8> (a java.lang.Object)at ls.lock.Test$2.run(Test.java:25)
"Thread-0":at ls.lock.LeftRightDeadLock.leftRight(LeftRightDeadLock.java:20)- waiting to lock <0x00000000d7d53cb8> (a java.lang.Object)- locked <0x00000000d7d53ca8> (a java.lang.Object)at ls.lock.Test$1.run(Test.java:15)Found 1 deadlock.HeapPSYoungGen      total 36352K, used 3751K [0x00000000d7c00000, 0x00000000da480000, 0x0000000100000000)eden space 31232K, 12% used [0x00000000d7c00000,0x00000000d7fa9ce0,0x00000000d9a80000)from space 5120K, 0% used [0x00000000d9f80000,0x00000000d9f80000,0x00000000da480000)to   space 5120K, 0% used [0x00000000d9a80000,0x00000000d9a80000,0x00000000d9f80000)ParOldGen       total 82432K, used 0K [0x0000000087400000, 0x000000008c480000, 0x00000000d7c00000)object space 82432K, 0% used [0x0000000087400000,0x0000000087400000,0x000000008c480000)PSPermGen       total 21504K, used 3201K [0x0000000082200000, 0x0000000083700000, 0x0000000087400000)object space 21504K, 14% used [0x0000000082200000,0x0000000082520540,0x0000000083700000)

参考:

https://blog.csdn.net/rachel_luo/article/details/8920596
https://www.javatang.com/archives/tag/%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F
http://just2do.iteye.com/blog/2275894
https://www.javatang.com/archives/2017/10/19/33151873.html
https://dzone.com/articles/how-analyze-java-thread-dumps
https://www.cnblogs.com/zhengyun_ustc/archive/2013/01/06/dumpanalysis.html
https://blog.csdn.net/rachel_luo/article/details/8920596
http://jameswxx.iteye.com/blog/1041173
https://blog.csdn.net/wanyanxgf/article/details/6944987
https://blog.csdn.net/sprayabc/article/details/8509218
http://www.7dtest.com/site/article-80-1.html
https://blog.csdn.net/rachel_luo/article/details/8990202
https://blog.csdn.net/rachel_luo/article/details/8992461
http://planeteclipse.org/planet/
http://mindprod.com/jgloss/interned.html
http://mindprod.com/jgloss/weak.html
http://mindprod.com/jgloss/permgen.html
http://mindprod.com/jgloss/classloader.html
http://www.cnblogs.com/toSeeMyDream/p/7151635.html

thread dump分析相关推荐

  1. (转)性能分析之-- JAVA Thread Dump 分析综述

    原文链接:http://blog.csdn.net/rachel_luo/article/details/8920596 最近在做性能测试,需要对线程堆栈进行分析,在网上收集了一些资料,学习完后,将相 ...

  2. java Thread Dump 日志分析

    jstack Dump 日志文件中的线程状态 dump 文件里,值得关注的线程状态有: 死锁,Deadlock(重点关注) 执行中,Runnable 等待资源,Waiting on condition ...

  3. Java分析系列之五:常见的Thread Dump日志案例分析

    我们在上篇文章中详细描述了Thread Dump中Native Thread和JVM Thread线程的各种状态及描述,今天总结分析的一些原则,并详细列举一些案例进行说明. 目录 [隐藏] 1 症状及 ...

  4. java thread dump

    一.thread dump 产品是Java写的,运行于JBOSS平台.操作系统为linux.当系统出现问题是很,可以通过thread dump分析就可以找到,但这只是解决问题的第一步,即找到问题的所在 ...

  5. Java线程Dump分析

    Thread Dump介绍 什么是Thread Dump Thread Dump是非常有用的诊断Java应用问题的工具.每一个Java虚拟机都有及时生成所有线程在某一点状态的thread-dump的能 ...

  6. JVM Dump分析

    Thread Dump介绍 Thread Dump是非常有用的诊断 Java应用问题的工具.每一个 Java虚拟机都有及时生成所有线程在某一点状态的 thread-dump的能力,虽然各个 Java虚 ...

  7. Thread dump文件抓取和分析(JCA工具)

    Thread dump文件抓取和分析 接下来分析CentOS下怎么抓取Thread dump文件,JCA怎么分析Thread dump文件. 1.CentOS下抓取Thread dump文件 Cent ...

  8. java多线程基础篇(二)java线程常见问题Thread Dump日志分析

    线程常见问题 CPU占用率很高,响应很慢 CPU占用率不高,但响应很慢 线程出现死锁的情况 CPU占用率不高,但响应很慢 有的时候我们会发现CPU占用率不高,系统日志也看不出问题,那么这种情况下,我们 ...

  9. 【JVM性能调优】jstack和线程dump分析

    一.几个概念: 1.jstack命令的语法格式:jstack <pid>,可用于查看java进程id. 2.Dump文件:Dump文件是进程的内存镜像.可以把程序的执行状态通过调试器保存到 ...

最新文章

  1. tomcat的webapps下没有出现配置过的文件夹
  2. java 输入流可以合并吗_HOW2J Java 文件输入输出流,合并与拆分
  3. PUE值测算标准实践问题探讨
  4. Moravec角点检测算子
  5. 动态规划算法之数塔问题
  6. OpenCV中绘制外围矩形框和圆框
  7. tensorflow分类的loss函数_tensorflow中loss函数
  8. [转]关于频率、模拟角频率、数字角频率
  9. (省赛系列——团队第三场)
  10. 基于React和Html5的宠物领养平台网站设计与实现
  11. 颜色透明度16进制对照表
  12. Mac 下读写NTFS文件
  13. shiro原理及其运行流程介绍
  14. C#进阶(一)——TXT文件处理:以导线网近似平差为例
  15. flask url_for()和redirect的区别
  16. warning: array subscript is above array bounds
  17. Kibana7.9.2设置elasticsearch索引过期时间,到期自动删除
  18. 数据结构大致包含以下几种存储结构:
  19. 【matlab_郭彦甫课程_统计题答案】
  20. 什么是 RESTful ?

热门文章

  1. ngrok服务器搭建流程
  2. log4j2测试用例
  3. python函数手册 stata_Python 与 Stata 配合批量转换数据
  4. 输入输出连接器-市场现状及未来发展趋势
  5. 开关电源的电流多大怎么选择
  6. html div居中属性,让div水平居中设置margin属性
  7. GDP-海藻糖,5‘-鸟苷二磷酸岩藻糖,GDP-fucose ,CAS:15839-70-0
  8. 读王坚博士的《在线》有感
  9. Composer入门教程 - 基本用法
  10. 0701微分方程的基本概念-微分方程