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

相关文章
相关标签/搜索