經過jps命令能夠得到Java應用的進程ID,以下html
List-1java
mjduan@mjduandeMacBook-Pro:/tmp % jps 18915 Jps 18260 Launcher 17957 18261 XXXXServiceApplication 11869 MainGenericRunner
用jstack命令jstack -l 18261>./18261jstack.txt拉取線程信息,18261是進程ID,文件18261jstack.txt的內容以下:tomcat
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,通常是等在鎖或者在線程安全的隊列中睡眠。bash
經過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:3d
1.JVM性能實戰,http://www.importnew.com/22434.htmlcode