GC之jstack

    經過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

相關文章
相關標籤/搜索