前言
Jstack用于分析java项目的线程,jstack与线程密切相关,学习Jstack日志要懂得线程的基本知识。
线程
线程的五/六种状态
- 初始(NEW)
- 运行(运行(RUNNING)/就绪(READY))(RUNNING):这里解释下,运行包含着运行和就绪两种状态,故有时候看到线程五种状态,有时候看到线程六种状态
- 等待(WAITING/TIMED_WAITING)
- 阻塞(BLOCKED)
- 终止(TERMINATED)
上述六种运行状态不详细说,主要说下状态转换流程。
等待队列和同步队列
- 线程中,分为等待队列和同步队列。
- 线程1获得对象的锁,正在使用对象A
- 线程1调用对象A的wait()方法
- 线程1释放对象A的锁,进入等待队列
- 同步队列的线程5成功竞争对象A的锁
- 线程5调用对象A的notifyAll()方法唤醒所有等待线程,等待队列所有线程都进入同步队列中
- notifyAll()方法的方法结束,线程5释放对象A的锁
- 同步队列的线程都竞争对象A的锁,但不知道哪个线程竞争成功
以上就是线程大概的学习知识,正式学习Jstack
Jstack
作用:分析且生成java项目的线程日志
线程还划分成三个区和两种线程状态,如上图所示:
三个区域
- 进入区(Entry Set)
- 拥有者区(The Owner)
- 等待区(Wait Set)
- 还有一个特殊区域:临界区 (指synchronized保护的代码区域)
两种线程状态
- 等待线程:a waiting thread
- 激活线程:an active thread(永远只有一个激活线程,对于一个对象锁来说)
结合线程六种状态(这里把运行拆成运行和就绪)和Jstack的三个区域,可以总结出:
进入区:初始(NEW)、就绪(READY)
拥有者区:运行(RUNNING)、阻塞(BLOCKED)
等待区:等待(WAITING/TIME_WAITING)
Jstack指令
- 控制台打印当前线程日志:jstack -l pid
- 生成线程日志:jstack -l pid > 日志文件夹/日志名.log
项目代码最后贴出以一个死锁为案例和完整的日志。
由于日志太长,会影响阅读,抽取部分日志展开说明常见的单词和线程的状态和三个区
常见的单词
- locked<地址>:该线程拥有对象锁,对象锁的地址是....
- waiting to lock<地址>:该线程未获取锁成功,在进入区等待锁,锁的地址是.....
- waiting on <地址>:该线程获得锁,但释放并进入等待区等待
- parking to wait for<地址>:该线程把锁交给了特定的线程(管理Park关键字的线程),且进入等待区等待,需要unPark唤醒自己
- Deadlock:死锁
项目代码最后贴出以一个死锁为案例和完整的日志。
由于日志太长,会影响阅读,抽取部分日志展开说明上述常见的单词和线程的状态和三个区
简单回忆Jstat的名词
"G1 Young RemSet Sampling" os_prio=2 cpu=0.00ms elapsed=626.66s tid=0x000001877fa23800 nid=0x4b64 runnable
- os_prio:系统线程优先度,视具体的操作系统
- cpu:线程占用cpu的时间
- elapsed:线程花费的总时间(cpu+wait)
- tid:java线程id
- nid:系统线程id
线程状态
- java.lang.Thread.State: RUNNABLE
- java.lang.Thread.State: WAITING (on object monitor)
- java.lang.Thread.State: TIMED_WAITING (on object monitor)
- java.lang.Thread.State: BLOCKED (on object monitor)
单独拿出来解释,没有结合实际场景(只是让人理解),实际情况下需要结合场景分析
runnable:线程处于运行状态-拥有者区
"G1 Young RemSet Sampling" os_prio=2 cpu=0.00ms elapsed=626.66s tid=0x000001877fa23800 nid=0x4b64 runnable
waiting on condition:线程处于等待状态(达成某个条件就重新获得锁)-等待区
"VM Periodic Task Thread" os_prio=2 cpu=0.00ms elapsed=626.26s tid=0x000001870fb33000 nid=0x45d8 waiting on condition
in Object.wait():线程处于等待状态-等待区
"Common-Cleaner" #11 daemon prio=8 os_prio=1 cpu=0.00ms elapsed=626.59s tid=0x000001877fdd2000 nid=0x3e70 in Object.wait() [0x00000042087ff000]
waiting for monitor entry:线程处于就绪状态,等到获得锁-进入区
"Thread-1" #36 daemon prio=5 os_prio=0 cpu=0.00ms elapsed=623.06s tid=0x0000018711392800 nid=0x4340 waiting for monitor entry [0x000000420a3ff000]
实际场景
Waiting to lock 和 Blocked
"Thread-1" #36 daemon prio=5 os_prio=0 cpu=0.00ms elapsed=623.06s tid=0x0000018711392800 nid=0x4340 waiting for monitor entry [0x000000420a3ff000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.gc.demo.thread.DieLock.run(DieLock.java:22)
- waiting to lock <0x0000000713f35a60> (a java.lang.Object)
- locked <0x0000000713f35a50> (a java.lang.Object)
at java.lang.Thread.run(java.base@11.0.2/Thread.java:834)
Locked ownable synchronizers:
- None
- blocked:线程处于阻塞状态状态
- waiting to lock:线程等待<0x0000000713f35a60>地址锁
- lock:线程拥有 <0x0000000713f35a50> 地址锁
- waiting for monitor entry:线程在进入区
Waiting on condition 和 TIMED_WAITING
"Catalina-utility-2" #23 prio=1 os_prio=-2 cpu=0.00ms elapsed=625.47s tid=0x0000018711325000 nid=0x3160 waiting on condition [0x0000004209afe000]
java.lang.Thread.State: TIMED_WAITING (parking)
at jdk.internal.misc.Unsafe.park(java.base@11.0.2/Native Method)
- parking to wait for <0x0000000710b7d220> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.parkNanos(java.base@11.0.2/LockSupport.java:234)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(java.base@11.0.2/AbstractQueuedSynchronizer.java:2123)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@11.0.2/ScheduledThreadPoolExecutor.java:1182)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@11.0.2/ScheduledThreadPoolExecutor.java:899)
at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@11.0.2/ThreadPoolExecutor.java:1054)
at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.2/ThreadPoolExecutor.java:1114)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.2/ThreadPoolExecutor.java:628)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(java.base@11.0.2/Thread.java:834)
Locked ownable synchronizers:
- None
- TIMED_WAITING :线程处于等待状态
- waiting on condition:在等待区等待达成某个条件被唤醒
in Obejct.wait() 和 TIMED_WAITING
"Common-Cleaner" #11 daemon prio=8 os_prio=1 cpu=0.00ms elapsed=626.59s tid=0x000001877fdd2000 nid=0x3e70 in Object.wait() [0x00000042087ff000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(java.base@11.0.2/Native Method)
- waiting on <0x00000007013be250> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(java.base@11.0.2/ReferenceQueue.java:155)
- waiting to re-lock in wait() <0x00000007013be250> (a java.lang.ref.ReferenceQueue$Lock)
at jdk.internal.ref.CleanerImpl.run(java.base@11.0.2/CleanerImpl.java:148)
at java.lang.Thread.run(java.base@11.0.2/Thread.java:834)
at jdk.internal.misc.InnocuousThread.run(java.base@11.0.2/InnocuousThread.java:134)
Locked ownable synchronizers:
- None
- in Object.wait():线程在等待区等待某个对象锁
- TIMED_WAITING :线程处于等待状态
Deadlock
死锁,可以看出Thread-1和Thread-2之间互相持有对方想要的锁,最后导致大家都阻塞,死锁
===================================================
"Thread-1":
at com.gc.demo.thread.DieLock.run(DieLock.java:22)
- waiting to lock <0x0000000713f35a60> (a java.lang.Object)
- locked <0x0000000713f35a50> (a java.lang.Object)
at java.lang.Thread.run(java.base@11.0.2/Thread.java:834)
"Thread-2":
at com.gc.demo.thread.DieLock.run(DieLock.java:32)
- waiting to lock <0x0000000713f35a50> (a java.lang.Object)
- locked <0x0000000713f35a60> (a java.lang.Object)
at java.lang.Thread.run(java.base@11.0.2/Thread.java:834)
Found 1 deadlock.
示例代码:https://gitee.com/banbeisudashui/gc-demo.git
/**
* 死锁,用于Jstack日志打印
* @return 换成main方法也行,只是刚好有个controller,就放进去
*/
@RequestMapping("dealLock")
public String dealLock(){
DieLock d1 = new DieLock(true);
DieLock d2 = new DieLock(false);
Thread t1 = new Thread(d1);
Thread t2 = new Thread(d2);
t1.start();
t2.start();
return "dealLock";
}
DieLock
/**
* @author Leo
* @description
* @createDate 2021/8/30 22:21
**/
public class DieLock implements Runnable {
private boolean flag;
public DieLock(boolean flag) {
this.flag = flag;
}
@Override
public void run() {
if (flag) {
while (true) {
synchronized (MyLock.obj1) {
System.out.println(Thread.currentThread().getName() + "....if...obj1..." + flag);
synchronized (MyLock.obj2) {
System.out.println(Thread.currentThread().getName() + ".....if.....obj2....." + flag);
}
}
}
} else {
while (true) {
synchronized (MyLock.obj2) {
System.out.println(Thread.currentThread().getName() + "....else...obj2..." + flag);
synchronized (MyLock.obj1) {
System.out.println(Thread.currentThread().getName() + ".....else.....obj1....." + flag);
}
}
}
}
}
}
MyLock
/**
* @author Leo
* @description
* @createDate 2021/8/30 22:22
**/
public class MyLock {
public static Object obj1 = new Object();
public static Object obj2 = new Object();
}
案例完整日志:
2021-08-30 22:34:28
Full thread dump OpenJDK 64-Bit Server VM (11.0.2+9 mixed mode):
Threads class SMR info:
_java_thread_list=0x000001871130aa30, length=31, elements={
0x000001877fb3e800, 0x000001877fb4a800, 0x000001877fc5a000, 0x000001877fc5c000,
0x000001877fc61000, 0x000001877fc6a000, 0x000001877fdd2000, 0x000001877fe51800,
0x000001877fe6e000, 0x000001877fe71000, 0x000001877ff59800, 0x000001870fb2c000,
0x0000018711324800, 0x0000018711325000, 0x0000018711395000, 0x0000018711397800,
0x0000018711395800, 0x0000018711391800, 0x0000018711396800, 0x0000018711398000,
0x0000018711392800, 0x0000018711394000, 0x0000018711393000, 0x000001870f99e000,
0x000001870f9a1000, 0x000001870f9a4800, 0x000001870f9a2000, 0x000001870f9a2800,
0x000001870f99e800, 0x000001870f9a3800, 0x000001870f9a5000
}
"Reference Handler" #2 daemon prio=10 os_prio=2 cpu=0.00ms elapsed=626.65s tid=0x000001877fb3e800 nid=0x4dec waiting on condition [0x00000042081ff000]
java.lang.Thread.State: RUNNABLE
at java.lang.ref.Reference.waitForReferencePendingList(java.base@11.0.2/Native Method)
at java.lang.ref.Reference.processPendingReferences(java.base@11.0.2/Reference.java:241)
at java.lang.ref.Reference$ReferenceHandler.run(java.base@11.0.2/Reference.java:213)
Locked ownable synchronizers:
- None
"Finalizer" #3 daemon prio=8 os_prio=1 cpu=0.00ms elapsed=626.64s tid=0x000001877fb4a800 nid=0x3be8 in Object.wait() [0x00000042082ff000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(java.base@11.0.2/Native Method)
- waiting on <0x00000007013c0970> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(java.base@11.0.2/ReferenceQueue.java:155)
- waiting to re-lock in wait() <0x00000007013c0970> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(java.base@11.0.2/ReferenceQueue.java:176)
at java.lang.ref.Finalizer$FinalizerThread.run(java.base@11.0.2/Finalizer.java:170)
Locked ownable synchronizers:
- None
"Signal Dispatcher" #4 daemon prio=9 os_prio=2 cpu=0.00ms elapsed=626.63s tid=0x000001877fc5a000 nid=0x2eac runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Attach Listener" #5 daemon prio=5 os_prio=2 cpu=0.00ms elapsed=626.63s tid=0x000001877fc5c000 nid=0x2e40 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"C1 CompilerThread0" #6 daemon prio=9 os_prio=2 cpu=250.00ms elapsed=626.63s tid=0x000001877fc61000 nid=0x3f78 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
No compile task
Locked ownable synchronizers:
- None
"Sweeper thread" #10 daemon prio=9 os_prio=2 cpu=0.00ms elapsed=626.63s tid=0x000001877fc6a000 nid=0x2108 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Common-Cleaner" #11 daemon prio=8 os_prio=1 cpu=0.00ms elapsed=626.59s tid=0x000001877fdd2000 nid=0x3e70 in Object.wait() [0x00000042087ff000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(java.base@11.0.2/Native Method)
- waiting on <0x00000007013be250> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(java.base@11.0.2/ReferenceQueue.java:155)
- waiting to re-lock in wait() <0x00000007013be250> (a java.lang.ref.ReferenceQueue$Lock)
at jdk.internal.ref.CleanerImpl.run(java.base@11.0.2/CleanerImpl.java:148)
at java.lang.Thread.run(java.base@11.0.2/Thread.java:834)
at jdk.internal.misc.InnocuousThread.run(java.base@11.0.2/InnocuousThread.java:134)
Locked ownable synchronizers:
- None
"JDWP Transport Listener: dt_socket" #12 daemon prio=10 os_prio=0 cpu=15.63ms elapsed=626.57s tid=0x000001877fe51800 nid=0x433c runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"JDWP Event Helper Thread" #13 daemon prio=10 os_prio=0 cpu=46.88ms elapsed=626.57s tid=0x000001877fe6e000 nid=0x36e4 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"JDWP Command Reader" #14 daemon prio=10 os_prio=0 cpu=0.00ms elapsed=626.57s tid=0x000001877fe71000 nid=0x4010 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Service Thread" #15 daemon prio=9 os_prio=0 cpu=0.00ms elapsed=626.47s tid=0x000001877ff59800 nid=0x2484 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"RMI TCP Accept-0" #17 daemon prio=5 os_prio=0 cpu=46.88ms elapsed=626.27s tid=0x000001870fb2c000 nid=0x1c58 runnable [0x0000004208dfe000]
java.lang.Thread.State: RUNNABLE
at java.net.PlainSocketImpl.accept0(java.base@11.0.2/Native Method)
at java.net.PlainSocketImpl.socketAccept(java.base@11.0.2/PlainSocketImpl.java:159)
at java.net.AbstractPlainSocketImpl.accept(java.base@11.0.2/AbstractPlainSocketImpl.java:458)
at java.net.ServerSocket.implAccept(java.base@11.0.2/ServerSocket.java:551)
at java.net.ServerSocket.accept(java.base@11.0.2/ServerSocket.java:519)
at sun.management.jmxremote.LocalRMIServerSocketFactory$1.accept(jdk.management.agent@11.0.2/LocalRMIServerSocketFactory.java:52)
at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(java.rmi@11.0.2/TCPTransport.java:394)
at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(java.rmi@11.0.2/TCPTransport.java:366)
at java.lang.Thread.run(java.base@11.0.2/Thread.java:834)
Locked ownable synchronizers:
- None
"Catalina-utility-1" #22 prio=1 os_prio=-2 cpu=0.00ms elapsed=625.47s tid=0x0000018711324800 nid=0x17d0 waiting on condition [0x00000042099fe000]
java.lang.Thread.State: WAITING (parking)
at jdk.internal.misc.Unsafe.park(java.base@11.0.2/Native Method)
- parking to wait for <0x0000000710b7d220> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(java.base@11.0.2/LockSupport.java:194)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@11.0.2/AbstractQueuedSynchronizer.java:2081)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@11.0.2/ScheduledThreadPoolExecutor.java:1177)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@11.0.2/ScheduledThreadPoolExecutor.java:899)
at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@11.0.2/ThreadPoolExecutor.java:1054)
at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.2/ThreadPoolExecutor.java:1114)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.2/ThreadPoolExecutor.java:628)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(java.base@11.0.2/Thread.java:834)
Locked ownable synchronizers:
- None
"Catalina-utility-2" #23 prio=1 os_prio=-2 cpu=0.00ms elapsed=625.47s tid=0x0000018711325000 nid=0x3160 waiting on condition [0x0000004209afe000]
java.lang.Thread.State: TIMED_WAITING (parking)
at jdk.internal.misc.Unsafe.park(java.base@11.0.2/Native Method)
- parking to wait for <0x0000000710b7d220> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.parkNanos(java.base@11.0.2/LockSupport.java:234)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(java.base@11.0.2/AbstractQueuedSynchronizer.java:2123)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@11.0.2/ScheduledThreadPoolExecutor.java:1182)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@11.0.2/ScheduledThreadPoolExecutor.java:899)
at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@11.0.2/ThreadPoolExecutor.java:1054)
at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.2/ThreadPoolExecutor.java:1114)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.2/ThreadPoolExecutor.java:628)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(java.base@11.0.2/Thread.java:834)
Locked ownable synchronizers:
- None
"RMI Scheduler(0)" #24 daemon prio=5 os_prio=0 cpu=0.00ms elapsed=625.47s tid=0x0000018711395000 nid=0x42ec waiting on condition [0x0000004209bfe000]
java.lang.Thread.State: TIMED_WAITING (parking)
at jdk.internal.misc.Unsafe.park(java.base@11.0.2/Native Method)
- parking to wait for <0x00000007013466b0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.parkNanos(java.base@11.0.2/LockSupport.java:234)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(java.base@11.0.2/AbstractQueuedSynchronizer.java:2123)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@11.0.2/ScheduledThreadPoolExecutor.java:1182)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@11.0.2/ScheduledThreadPoolExecutor.java:899)
at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@11.0.2/ThreadPoolExecutor.java:1054)
at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.2/ThreadPoolExecutor.java:1114)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.2/ThreadPoolExecutor.java:628)
at java.lang.Thread.run(java.base@11.0.2/Thread.java:834)
Locked ownable synchronizers:
- None
"container-0" #25 prio=5 os_prio=0 cpu=0.00ms elapsed=625.47s tid=0x0000018711397800 nid=0x4ff8 waiting on condition [0x0000004209cfe000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(java.base@11.0.2/Native Method)
at org.apache.catalina.core.StandardServer.await(StandardServer.java:563)
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer$1.run(TomcatWebServer.java:197)
Locked ownable synchronizers:
- None
"http-nio-8080-Poller" #27 daemon prio=5 os_prio=0 cpu=0.00ms elapsed=625.33s tid=0x0000018711395800 nid=0x469c runnable [0x0000004209dfe000]
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.WindowsSelectorImpl$SubSelector.poll0(java.base@11.0.2/Native Method)
at sun.nio.ch.WindowsSelectorImpl$SubSelector.poll(java.base@11.0.2/WindowsSelectorImpl.java:339)
at sun.nio.ch.WindowsSelectorImpl.doSelect(java.base@11.0.2/WindowsSelectorImpl.java:167)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(java.base@11.0.2/SelectorImpl.java:124)
- locked <0x0000000710b2ce48> (a sun.nio.ch.Util$2)
- locked <0x0000000710b2cdc0> (a sun.nio.ch.WindowsSelectorImpl)
at sun.nio.ch.SelectorImpl.select(java.base@11.0.2/SelectorImpl.java:136)
at org.apache.tomcat.util.net.NioEndpoint$Poller.run(NioEndpoint.java:787)
at java.lang.Thread.run(java.base@11.0.2/Thread.java:834)
Locked ownable synchronizers:
- None
"http-nio-8080-Acceptor" #28 daemon prio=5 os_prio=0 cpu=31.25ms elapsed=625.32s tid=0x0000018711391800 nid=0x23dc runnable [0x000000420a0fe000]
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.ServerSocketChannelImpl.accept0(java.base@11.0.2/Native Method)
at sun.nio.ch.ServerSocketChannelImpl.accept(java.base@11.0.2/ServerSocketChannelImpl.java:533)
at sun.nio.ch.ServerSocketChannelImpl.accept(java.base@11.0.2/ServerSocketChannelImpl.java:285)
at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:540)
at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:78)
at org.apache.tomcat.util.net.Acceptor.run(Acceptor.java:106)
at java.lang.Thread.run(java.base@11.0.2/Thread.java:834)
Locked ownable synchronizers:
- <0x00000007106fe3a0> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
"DestroyJavaVM" #29 prio=5 os_prio=0 cpu=1234.38ms elapsed=625.31s tid=0x0000018711396800 nid=0x49bc waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"http-nio-8080-exec-1" #35 daemon prio=5 os_prio=0 cpu=62.50ms elapsed=623.10s tid=0x0000018711398000 nid=0x408c waiting on condition [0x000000420a2ff000]
java.lang.Thread.State: WAITING (parking)
at jdk.internal.misc.Unsafe.park(java.base@11.0.2/Native Method)
- parking to wait for <0x0000000710bb5438> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(java.base@11.0.2/LockSupport.java:194)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@11.0.2/AbstractQueuedSynchronizer.java:2081)
at java.util.concurrent.LinkedBlockingQueue.take(java.base@11.0.2/LinkedBlockingQueue.java:433)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:146)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1114)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1176)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(java.base@11.0.2/Thread.java:834)
Locked ownable synchronizers:
- None
"Thread-1" #36 daemon prio=5 os_prio=0 cpu=0.00ms elapsed=623.06s tid=0x0000018711392800 nid=0x4340 waiting for monitor entry [0x000000420a3ff000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.gc.demo.thread.DieLock.run(DieLock.java:22)
- waiting to lock <0x0000000713f35a60> (a java.lang.Object)
- locked <0x0000000713f35a50> (a java.lang.Object)
at java.lang.Thread.run(java.base@11.0.2/Thread.java:834)
Locked ownable synchronizers:
- None
"Thread-2" #37 daemon prio=5 os_prio=0 cpu=0.00ms elapsed=623.06s tid=0x0000018711394000 nid=0x3e40 waiting for monitor entry [0x000000420a4ff000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.gc.demo.thread.DieLock.run(DieLock.java:32)
- waiting to lock <0x0000000713f35a50> (a java.lang.Object)
- locked <0x0000000713f35a60> (a java.lang.Object)
at java.lang.Thread.run(java.base@11.0.2/Thread.java:834)
Locked ownable synchronizers:
- None
"http-nio-8080-exec-2" #38 daemon prio=5 os_prio=0 cpu=0.00ms elapsed=563.01s tid=0x0000018711393000 nid=0xe18 waiting on condition [0x00000042077fe000]
java.lang.Thread.State: WAITING (parking)
at jdk.internal.misc.Unsafe.park(java.base@11.0.2/Native Method)
- parking to wait for <0x0000000710bb5438> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(java.base@11.0.2/LockSupport.java:194)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@11.0.2/AbstractQueuedSynchronizer.java:2081)
at java.util.concurrent.LinkedBlockingQueue.take(java.base@11.0.2/LinkedBlockingQueue.java:433)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:146)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1114)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1176)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(java.base@11.0.2/Thread.java:834)
Locked ownable synchronizers:
- None
"http-nio-8080-exec-3" #39 daemon prio=5 os_prio=0 cpu=31.25ms elapsed=538.09s tid=0x000001870f99e000 nid=0x4228 waiting on condition [0x00000042078fe000]
java.lang.Thread.State: WAITING (parking)
at jdk.internal.misc.Unsafe.park(java.base@11.0.2/Native Method)
- parking to wait for <0x0000000710bb5438> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(java.base@11.0.2/LockSupport.java:194)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@11.0.2/AbstractQueuedSynchronizer.java:2081)
at java.util.concurrent.LinkedBlockingQueue.take(java.base@11.0.2/LinkedBlockingQueue.java:433)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:146)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1114)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1176)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(java.base@11.0.2/Thread.java:834)
Locked ownable synchronizers:
- None
"http-nio-8080-exec-4" #40 daemon prio=5 os_prio=0 cpu=0.00ms elapsed=538.06s tid=0x000001870f9a1000 nid=0x3bd8 waiting on condition [0x00000042079fe000]
java.lang.Thread.State: WAITING (parking)
at jdk.internal.misc.Unsafe.park(java.base@11.0.2/Native Method)
- parking to wait for <0x0000000710bb5438> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(java.base@11.0.2/LockSupport.java:194)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@11.0.2/AbstractQueuedSynchronizer.java:2081)
at java.util.concurrent.LinkedBlockingQueue.take(java.base@11.0.2/LinkedBlockingQueue.java:433)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:146)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1114)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1176)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(java.base@11.0.2/Thread.java:834)
Locked ownable synchronizers:
- None
"http-nio-8080-exec-5" #41 daemon prio=5 os_prio=0 cpu=31.25ms elapsed=538.06s tid=0x000001870f9a4800 nid=0x457c waiting on condition [0x00000042090fe000]
java.lang.Thread.State: WAITING (parking)
at jdk.internal.misc.Unsafe.park(java.base@11.0.2/Native Method)
- parking to wait for <0x0000000710bb5438> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(java.base@11.0.2/LockSupport.java:194)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@11.0.2/AbstractQueuedSynchronizer.java:2081)
at java.util.concurrent.LinkedBlockingQueue.take(java.base@11.0.2/LinkedBlockingQueue.java:433)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:146)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1114)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1176)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(java.base@11.0.2/Thread.java:834)
Locked ownable synchronizers:
- None
"http-nio-8080-exec-6" #42 daemon prio=5 os_prio=0 cpu=15.63ms elapsed=536.63s tid=0x000001870f9a2000 nid=0x4b9c waiting on condition [0x000000420a1fe000]
java.lang.Thread.State: WAITING (parking)
at jdk.internal.misc.Unsafe.park(java.base@11.0.2/Native Method)
- parking to wait for <0x0000000710bb5438> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(java.base@11.0.2/LockSupport.java:194)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@11.0.2/AbstractQueuedSynchronizer.java:2081)
at java.util.concurrent.LinkedBlockingQueue.take(java.base@11.0.2/LinkedBlockingQueue.java:433)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:146)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1114)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1176)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(java.base@11.0.2/Thread.java:834)
Locked ownable synchronizers:
- None
"http-nio-8080-exec-7" #43 daemon prio=5 os_prio=0 cpu=0.00ms elapsed=536.63s tid=0x000001870f9a2800 nid=0x3608 waiting on condition [0x000000420a5ff000]
java.lang.Thread.State: WAITING (parking)
at jdk.internal.misc.Unsafe.park(java.base@11.0.2/Native Method)
- parking to wait for <0x0000000710bb5438> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(java.base@11.0.2/LockSupport.java:194)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@11.0.2/AbstractQueuedSynchronizer.java:2081)
at java.util.concurrent.LinkedBlockingQueue.take(java.base@11.0.2/LinkedBlockingQueue.java:433)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:146)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1114)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1176)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(java.base@11.0.2/Thread.java:834)
Locked ownable synchronizers:
- None
"http-nio-8080-exec-8" #44 daemon prio=5 os_prio=0 cpu=15.63ms elapsed=536.62s tid=0x000001870f99e800 nid=0x28bc waiting on condition [0x000000420a6ff000]
java.lang.Thread.State: WAITING (parking)
at jdk.internal.misc.Unsafe.park(java.base@11.0.2/Native Method)
- parking to wait for <0x0000000710bb5438> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(java.base@11.0.2/LockSupport.java:194)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@11.0.2/AbstractQueuedSynchronizer.java:2081)
at java.util.concurrent.LinkedBlockingQueue.take(java.base@11.0.2/LinkedBlockingQueue.java:433)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:146)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1114)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1176)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(java.base@11.0.2/Thread.java:834)
Locked ownable synchronizers:
- None
"http-nio-8080-exec-9" #45 daemon prio=5 os_prio=0 cpu=0.00ms elapsed=529.62s tid=0x000001870f9a3800 nid=0x2d88 waiting on condition [0x00000042096fe000]
java.lang.Thread.State: WAITING (parking)
at jdk.internal.misc.Unsafe.park(java.base@11.0.2/Native Method)
- parking to wait for <0x0000000710bb5438> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(java.base@11.0.2/LockSupport.java:194)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@11.0.2/AbstractQueuedSynchronizer.java:2081)
at java.util.concurrent.LinkedBlockingQueue.take(java.base@11.0.2/LinkedBlockingQueue.java:433)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:146)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1114)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1176)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(java.base@11.0.2/Thread.java:834)
Locked ownable synchronizers:
- None
"http-nio-8080-exec-10" #46 daemon prio=5 os_prio=0 cpu=15.63ms elapsed=529.61s tid=0x000001870f9a5000 nid=0x76c waiting on condition [0x000000420a7ff000]
java.lang.Thread.State: WAITING (parking)
at jdk.internal.misc.Unsafe.park(java.base@11.0.2/Native Method)
- parking to wait for <0x0000000710bb5438> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(java.base@11.0.2/LockSupport.java:194)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@11.0.2/AbstractQueuedSynchronizer.java:2081)
at java.util.concurrent.LinkedBlockingQueue.take(java.base@11.0.2/LinkedBlockingQueue.java:433)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:146)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1114)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1176)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(java.base@11.0.2/Thread.java:834)
Locked ownable synchronizers:
- None
"VM Thread" os_prio=2 cpu=31.25ms elapsed=626.65s tid=0x000001877fb3a800 nid=0x4cfc runnable
"GC Thread#0" os_prio=2 cpu=0.00ms elapsed=626.66s tid=0x000001876a665000 nid=0x3cfc runnable
"GC Thread#1" os_prio=2 cpu=0.00ms elapsed=626.16s tid=0x000001870ff82000 nid=0x496c runnable
"GC Thread#2" os_prio=2 cpu=0.00ms elapsed=626.16s tid=0x000001870ffe6000 nid=0x4c4c runnable
"GC Thread#3" os_prio=2 cpu=0.00ms elapsed=626.16s tid=0x000001870ffe7000 nid=0x6d8 runnable
"GC Thread#4" os_prio=2 cpu=31.25ms elapsed=626.16s tid=0x000001870ffe7800 nid=0x20fc runnable
"GC Thread#5" os_prio=2 cpu=0.00ms elapsed=626.16s tid=0x000001870ff8b000 nid=0x1f54 runnable
"GC Thread#6" os_prio=2 cpu=0.00ms elapsed=625.33s tid=0x0000018711427000 nid=0x10b4 runnable
"GC Thread#7" os_prio=2 cpu=0.00ms elapsed=625.33s tid=0x000001871149d800 nid=0x4a6c runnable
"G1 Main Marker" os_prio=2 cpu=0.00ms elapsed=626.66s tid=0x000001876a6c0000 nid=0x47a8 runnable
"G1 Conc#0" os_prio=2 cpu=0.00ms elapsed=626.66s tid=0x000001876a6c2000 nid=0x2d0c runnable
"G1 Conc#1" os_prio=2 cpu=0.00ms elapsed=625.95s tid=0x000001870fff3800 nid=0x4784 runnable
"G1 Conc#2" os_prio=2 cpu=0.00ms elapsed=625.95s tid=0x0000018710db6800 nid=0x4120 runnable
"G1 Refine#0" os_prio=2 cpu=0.00ms elapsed=626.66s tid=0x000001877fa22800 nid=0x1490 runnable
"G1 Young RemSet Sampling" os_prio=2 cpu=0.00ms elapsed=626.66s tid=0x000001877fa23800 nid=0x4b64 runnable
"VM Periodic Task Thread" os_prio=2 cpu=0.00ms elapsed=626.26s tid=0x000001870fb33000 nid=0x45d8 waiting on condition
JNI global refs: 64, weak refs: 12420
Found one Java-level deadlock:
=============================
"Thread-1":
waiting to lock monitor 0x0000018710d73200 (object 0x0000000713f35a60, a java.lang.Object),
which is held by "Thread-2"
"Thread-2":
waiting to lock monitor 0x000001877fb4a400 (object 0x0000000713f35a50, a java.lang.Object),
which is held by "Thread-1"
Java stack information for the threads listed above:
===================================================
"Thread-1":
at com.gc.demo.thread.DieLock.run(DieLock.java:22)
- waiting to lock <0x0000000713f35a60> (a java.lang.Object)
- locked <0x0000000713f35a50> (a java.lang.Object)
at java.lang.Thread.run(java.base@11.0.2/Thread.java:834)
"Thread-2":
at com.gc.demo.thread.DieLock.run(DieLock.java:32)
- waiting to lock <0x0000000713f35a50> (a java.lang.Object)
- locked <0x0000000713f35a60> (a java.lang.Object)
at java.lang.Thread.run(java.base@11.0.2/Thread.java:834)
Found 1 deadlock.