通过jps命令可以获得Java应用的进程ID,如下
List-1
mjduan@mjduandeMacBook-Pro:/tmp % jps
18915 Jps
18260 Launcher
17957
18261 XXXXServiceApplication
11869 MainGenericRunner
用jstack命令jstack -l 18261>./18261jstack.txt拉取线程信息,18261是进程ID,文件18261jstack.txt的内容如下:
List-2
2018-06-19 00:11:07
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.131-b11 mixed mode):
"Attach Listener" #84 daemon prio=9 os_prio=31 tid=0x00007f80678af000 nid=0x14003 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"DiscoveryClient-2" #83 daemon prio=5 os_prio=31 tid=0x00007f806a4b1800 nid=0x14103 waiting on condition [0x000070000fc72000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000007be267240> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1088)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- None
"DiscoveryClient-HeartbeatExecutor-0" #81 daemon prio=5 os_prio=31 tid=0x00007f80698ff800 nid=0x14303 waiting on condition [0x000070000fb6f000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000007be267458> (a java.util.concurrent.SynchronousQueue$TransferStack)
......
List-2中的只是文件的开头内容,后面还有Spring的线程,tomcat的线程,JVM自己的线程,通过线程名称可以看出来。一般情况下线程不是RUNNING或者WAITING,一般是等在锁或者在线程安全的队列中睡眠。
通过jstack的结果可以看出死锁,但是我目前还没有发现。
死锁: List-3 jstack拉取出来的文件中就提示我们发生死锁了,涉及的线程
Found one Java-level deadlock:
=============================
"Thread-1":
waiting to lock monitor 0x00007fd93d8211e8 (object 0x000000076b40a858, a java.lang.Object),
which is held by "Thread-0"
"Thread-0":
waiting to lock monitor 0x00007fd93d821558 (object 0x000000076b40a868, a java.lang.Object),
which is held by "Thread-1"
Java stack information for the threads listed above:
===================================================
"Thread-1":
at com.mjduan.project.TestDeadLock$MyRunnable2.run(TestDeadLock.java:60)
- waiting to lock <0x000000076b40a858> (a java.lang.Object)
- locked <0x000000076b40a868> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:748)
"Thread-0":
at com.mjduan.project.TestDeadLock$MyRunnable1.run(TestDeadLock.java:44)
- waiting to lock <0x000000076b40a868> (a java.lang.Object)
- locked <0x000000076b40a858> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:748)
Found 1 deadlock.
Reference:
1.JVM性能实战,http://www.importnew.com/22434.html
(adsbygoogle = window.adsbygoogle || []).push({});