前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GC之jstack 原

GC之jstack 原

作者头像
克虏伯
发布2019-04-15 14:22:35
8410
发布2019-04-15 14:22:35
举报

    通过jps命令可以获得Java应用的进程ID,如下

List-1

代码语言:javascript
复制
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

代码语言:javascript
复制
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拉取出来的文件中就提示我们发生死锁了,涉及的线程

代码语言:javascript
复制
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({});

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018/06/19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档