Java 虚拟机程序员

【Java 虚拟机笔记】jstack 堆栈跟踪工具相关整理

2019-03-04  本文已影响41人  58bc06151329

文前说明

作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写成博客与大家一起交流,也希望采用这种方式记录自己的学习之旅。

本文仅供学习交流使用,侵权必删。
不用于商业目的,转载请注明出处。

1. 堆栈跟踪工具(Stack Trace for Java)

1.1 命令格式

选项 说明
-F 强制。 使用 jstack [-l] pid 无响应时可以强制执行。
-l 长清单,打印有关锁的其他信息。http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/AbstractOwnableSynchronizer.html
-m 打印混合模式(Java 和 native C/C++)堆栈跟踪。
-h 打印帮助信息。
-help 打印帮助信息。

1.2 执行样例

[root@localhost ~]# sudo -u ovirt jstack -l 1638
2019-02-23 04:02:51
Full thread dump OpenJDK 64-Bit Server VM (24.161-b00 mixed mode):

"process reaper" daemon prio=10 tid=0x00007fe2900cb800 nid=0x30b8 waiting on condition [0x00007fe26c74d000]
   java.lang.Thread.State: TIMED_WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000000cd765128> (a java.util.concurrent.SynchronousQueue$TransferStack)
    at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:226)
    at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:460)
    at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:359)
    at java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:942)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1075)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:622)
    at java.lang.Thread.run(Thread.java:748)

   Locked ownable synchronizers:
    - None

"Attach Listener" daemon prio=10 tid=0x00007fe2900cb000 nid=0x2cb7 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
    - None

"ajp-/127.0.0.1:8702-11" daemon prio=10 tid=0x00007fe278308800 nid=0x7e1 in Object.wait() [0x00007fe26bea2000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:503)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:881)
    - locked <0x00000000d0102e68> (a org.apache.tomcat.util.net.JIoEndpoint$Worker)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:907)
    at java.lang.Thread.run(Thread.java:748)

   Locked ownable synchronizers:
    - None

"ajp-/127.0.0.1:8702-10" daemon prio=10 tid=0x00007fe2783cf000 nid=0x7da runnable [0x00007fe26bfa3000]
   java.lang.Thread.State: RUNNABLE
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:153)
    at java.net.SocketInputStream.read(SocketInputStream.java:122)
    at org.apache.coyote.ajp.AjpProcessor.read(AjpProcessor.java:1124)
    at org.apache.coyote.ajp.AjpProcessor.readMessage(AjpProcessor.java:1206)
    at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:438)
    at org.apache.coyote.ajp.AjpProtocol$AjpConnectionHandler.process(AjpProtocol.java:420)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:926)
    at java.lang.Thread.run(Thread.java:748)

1.3 输出格式

信息 说明
prio 线程的优先级
tid 线程 ID
nid 操作系统映射的线程 ID,(例如:nid=0x75a)
0x00007fcd86af2000 表示线程栈的起始地址。
0x00000000c709e5c0 锁的对象的 ID

发现死锁现象

Found one Java-level deadlock:
=============================
"Thread-1":
waiting to lock monitor 0x0003f334 (object 0x22c19f18, a java.lang.Object),
which is held by "Thread-0"
"Thread-0":
waiting to lock monitor 0x0003f314 (object 0x22c19f20, a java.lang.Object),
which is held by "Thread-1"
上一篇 下一篇

猜你喜欢

热点阅读