{"id":4946,"date":"2020-04-04T10:11:29","date_gmt":"2020-04-04T02:11:29","guid":{"rendered":"https:\/\/www.xttblog.com\/?p=4946"},"modified":"2020-04-04T11:58:07","modified_gmt":"2020-04-04T03:58:07","slug":"jstack-%e5%91%bd%e4%bb%a4%e4%bd%bf%e7%94%a8%e7%bb%8f%e9%aa%8c%e6%80%bb%e7%bb%93%e5%92%8c%e7%ba%bf%e7%a8%8b%e6%80%a7%e8%83%bd%e8%af%8a%e6%96%ad%e8%84%9a%e6%9c%ac","status":"publish","type":"post","link":"https:\/\/www.xttblog.com\/?p=4946","title":{"rendered":"jstack \u547d\u4ee4\u4f7f\u7528\u7ecf\u9a8c\u603b\u7ed3\u548c\u7ebf\u7a0b\u6027\u80fd\u8bca\u65ad\u811a\u672c"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\u5206\u4eab\u4e00\u4e0b\uff0cjstack \u547d\u4ee4\u4f7f\u7528\u7ecf\u9a8c\u603b\u7ed3\u3002<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>jstack \u5728\u547d\u4ee4\u4f7f\u7528\u4e0a\u5341\u5206\u7b80\u6d01, \u7136\u800c\u5176\u8f93\u51fa\u7684\u5185\u5bb9\u5374\u5341\u5206\u4e30\u5bcc, \u4fe1\u606f\u91cf\u8db3, \u503c\u5f97\u6df1\u5165\u5206\u6790;\n\u4ee5\u5f80\u5bf9\u4e8e jstack \u4ea7\u751f\u7684 thread dump, \u6211\u5f88\u5c11\u5b57\u659f\u53e5\u914c\u5f97\u5206\u6790\u8fc7\u6bcf\u4e00\u90e8\u5206\u7ec6\u8282, \u9488\u5bf9 jstack \u7684\u6027\u80fd\u8bca\u65ad\u4e5f\u6ca1\u6709\u4e00\u4e2a\u6a21\u5f0f\u5316\u7684\u603b\u7ed3; \u4eca\u5929\u8fd9\u7bc7\u6587\u7ae0\u6211\u5c31\u6765\u8be6\u7ec6\u6574\u7406\u4e00\u4e0b\u4e0e jstack \u76f8\u5173\u7684\u5185\u5bb9;<\/p><\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"jstack\">jstack \u547d\u4ee4\u7684\u57fa\u672c\u4f7f\u7528<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">jstack \u5728\u547d\u4ee4\u4f7f\u7528\u4e0a\u5341\u5206\u7b80\u6d01, \u5176\u4fe1\u606f\u91cf\u4e0e\u590d\u6742\u5ea6\u4e3b\u8981\u4f53\u73b0\u5728 thread dump \u5185\u5bb9\u7684\u5206\u6790\u4e0a;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \u6700\u57fa\u672c\u7684\u4f7f\u7528\nsudo -u xxx jstack {vmid}\n# \u4ece core dump \u4e2d\u63d0\u53d6 thread dump\nsudo -u xxx jstack core_file_path\n# \u9664\u4e86\u57fa\u672c\u8f93\u51fa\u5916, \u989d\u5916\u5c55\u793a AbstractOwnableSynchronizer \u9501\u7684\u5360\u6709\u4fe1\u606f\n# \u53ef\u80fd\u4f1a\u6d88\u8017\u8f83\u957f\u65f6\u95f4\nsudo -u xxx jstack -l {vmid}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"jstack-1\">jstack \u8f93\u51fa\u5185\u5bb9\u7ed3\u6784\u5206\u6790<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u9996\u5148\u5c55\u793a\u51e0\u6bb5 thread dump \u7684\u5178\u578b\u4f8b\u5b50:\n\u6b63\u5728 RUNNING \u4e2d\u7684\u7ebf\u7a0b:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\"elasticsearch[datanode-39][[xxx_index_v4][9]: Lucene Merge Thread #2403]\" #45061 daemon prio=5 os_prio=0 tid=0x00007fb968213800 nid=0x249ca runnable [0x00007fb6843c2000]\n   java.lang.Thread.State: RUNNABLE\n        ...\n        at org.elasticsearch.index.engine.ElasticsearchConcurrentMergeScheduler.doMerge(ElasticsearchConcurrentMergeScheduler.java:94)\n        at org.apache.lucene.index.ConcurrentMergeScheduler$MergeThread.run(ConcurrentMergeScheduler.java:626)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u963b\u585e\u5728 java.util.concurrent.locks.Condition \u4e0a:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\"DubboServerHandler-10.64.16.66:20779-thread-510\" #631 daemon prio=5 os_prio=0 tid=0x00007fb6f4ce5800 nid=0x1743 waiting on condition [0x00007fb68ed2f000]\n   java.lang.Thread.State: WAITING (parking)\n        at sun.misc.Unsafe.park(Native Method)\n        - parking to wait for  &lt;0x00000000e2978ef0&gt; (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)\n        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)\n        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)\n        ...<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u963b\u585e\u5728\u5185\u7f6e\u9501\u4e0a:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\"qtp302870502-26-acceptor-0@45ff00a-ServerConnector@63475ace{HTTP\/1.1}{0.0.0.0:9088}\" #26 prio=5 os_prio=0 tid=0x00007f1830d3a800 nid=0xdf64 waiting for monitor entry [0x00007f16b5ef9000]\n   java.lang.Thread.State: BLOCKED (on object monitor)\n        at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:234)\n        - waiting to lock &lt;0x00000000c07549f8&gt; (a java.lang.Object)\n        at org.eclipse.jetty.server.ServerConnector.accept(ServerConnector.java:377)\n        ...\n        at java.lang.Thread.run(Thread.java:745)<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>\"JFR request timer\" #6 daemon prio=5 os_prio=0 tid=0x00007fc2f6b1f800 nid=0x18070 in Object.wait() [0x00007fb9aa96b000]\n   java.lang.Thread.State: WAITING (on object monitor)\n        at java.lang.Object.wait(Native Method)\n        - waiting on &lt;0x00007fba6b50ea38&gt; (a java.util.TaskQueue)\n        at java.lang.Object.wait(Object.java:502)\n        at java.util.TimerThread.mainLoop(Timer.java:526)\n        - locked &lt;0x00007fba6b50ea38&gt; (a java.util.TaskQueue)\n        at java.util.TimerThread.run(Timer.java:505)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u4ee5\u4e0a\u5c55\u793a\u4e86\u56db\u4e2a\u7ebf\u7a0b\u7684 jstack dump, \u6709 running \u72b6\u6001, \u4e5f\u6709\u963b\u585e\u72b6\u6001, \u8986\u76d6\u9762\u5e7f, \u5177\u6709\u5178\u578b\u6027; \u4e0b\u9762\u6765\u5bf9 jstack \u7684\u8f93\u51fa\u5185\u5bb9\u4f5c\u8be6\u7ec6\u68b3\u7406\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u8f93\u51fa\u5185\u5bb9\u7684\u7ed3\u6784<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u9996\u5148\u8fd8\u662f\u8981\u8bf4\u4e00\u4e0b jstack \u8f93\u51fa\u7684\u5185\u5bb9\u7ed3\u6784, \u5c31\u4ee5\u4e0a\u65b9\u4e3e\u7684\u7b2c\u56db\u4e2a\u7ebf\u7a0b\u4e3a\u4f8b:\n\u4ee5\u4e0b\u662f\u7b2c\u4e00\u90e8\u5206\u5185\u5bb9, \u8bb0\u5f55\u4e86\u7ebf\u7a0b\u7684\u4e00\u4e9b\u57fa\u672c\u4fe1\u606f, \u4ece\u5de6\u5230\u53f3\u6bcf\u4e2a\u5143\u7d20\u7684\u542b\u4e49\u5df2\u7ecf\u4ee5\u6ce8\u91ca\u6807\u6ce8\u5728\u5143\u7d20\u4e0a\u65b9; \u5176\u4e2d\u6bd4\u8f83\u91cd\u8981\u7684\u662f nid, \u5b83\u662f java \u7ebf\u7a0b\u4e0e\u64cd\u4f5c\u7cfb\u7edf\u7684\u6620\u5c04, \u5728 linux \u4e2d\u5b83\u548c\u4e0e\u5176\u5bf9\u5e94\u7684\u8f7b\u91cf\u7ea7\u8fdb\u7a0b pid \u76f8\u540c (\u9700\u8981\u5341\u516d\u8fdb\u5236\u4e0e\u5341\u8fdb\u5236\u8f6c\u6362), \u8fd9\u5c06\u4e3a\u57fa\u4e8e java \u7ebf\u7a0b\u7684\u6027\u80fd\u8bca\u65ad\u5e26\u6765\u5e2e\u52a9, \u5982\u9700\u5e2e\u52a9\uff0c\u53ef\u4ee5\u52a0\u6211Wx\uff1acodedq\uff0c\u514d\u8d39\u83b7\u5f97\u201c\u7ebf\u7a0b\u6027\u80fd\u8bca\u65ad\u7684\u8f85\u52a9\u811a\u672c\u201d\u548c Shell \u89c6\u9891\u6559\u7a0b\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/|-----\u7ebf\u7a0b\u540d------| |-\u7ebf\u7a0b\u521b\u5efa\u6b21\u5e8f-| |\u662f\u5426\u5b88\u62a4\u8fdb\u7a0b| |---\u7ebf\u7a0b\u4f18\u5148\u7ea7---| |-------\u7ebf\u7a0b id-------| |-\u6240\u6620\u5c04\u7684linux\u8f7b\u91cf\u7ea7\u8fdb\u7a0bid-| |-------------\u7ebf\u7a0b\u52a8\u4f5c--------------|\n  \"JFR request timer\" #6              daemon        prio=5 os_prio=0  tid=0x00007fc2f6b1f800 nid=0x18070                 in Object.wait() [0x00007fb9aa96b000]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u4ee5\u4e0b\u662f\u7b2c\u4e8c\u90e8\u5206\u5185\u5bb9, \u8868\u793a\u7ebf\u7a0b\u5f53\u524d\u7684\u72b6\u6001\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>java.lang.Thread.State: WAITING (on object monitor)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u4ee5\u4e0b\u662f\u7b2c\u4e09\u90e8\u5206\u5185\u5bb9, \u4e3b\u8981\u8bb0\u5f55\u4e86\u7ebf\u7a0b\u7684\u8c03\u7528\u6808; \u5176\u4e2d\u6bd4\u8f83\u91cd\u8981\u7684\u662f\u4e00\u4e9b\u5173\u952e\u8c03\u7528\u4e0a\u7684 \u52a8\u4f5c\u4fee\u9970, \u8fd9\u4e9b\u4e3a\u7ebf\u7a0b\u6b7b\u9501\u95ee\u9898\u7684\u6392\u67e5\u63d0\u4f9b\u4e86\u4f9d\u636e\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>at java.lang.Object.wait(Native Method)\n- waiting on &lt;0x00007fba6b50ea38&gt; (a java.util.TaskQueue)\nat java.lang.Object.wait(Object.java:502)\nat java.util.TimerThread.mainLoop(Timer.java:526)\n- locked &lt;0x00007fba6b50ea38&gt; (a java.util.TaskQueue)\nat java.util.TimerThread.run(Timer.java:505)<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"-1\">\u7ebf\u7a0b\u7684\u52a8\u4f5c<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u7ebf\u7a0b\u52a8\u4f5c\u7684\u8bb0\u5f55\u5728\u6bcf\u4e2a thread dump \u7684\u7b2c\u4e00\u884c\u672b\u5c3e, \u4e00\u822c\u60c5\u51b5\u4e0b\u53ef\u5206\u4e3a\u5982\u4e0b\u51e0\u7c7b:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>runnable, \u8868\u793a\u7ebf\u7a0b\u5728\u53c2\u4e0e cpu \u8d44\u6e90\u7684\u7ade\u4e89, \u53ef\u80fd\u5728\u88ab\u8c03\u5ea6\u8fd0\u884c\u4e5f\u53ef\u80fd\u5728\u5c31\u7eea\u7b49\u5f85;<\/li><li>sleeping, \u8868\u793a\u8c03\u7528\u4e86 Thread.sleep(), \u7ebf\u7a0b\u8fdb\u5165\u4f11\u7720;<\/li><li>waiting for monitor entry [0x&#8230;], \u8868\u793a\u7ebf\u7a0b\u5728\u8bd5\u56fe\u83b7\u53d6\u5185\u7f6e\u9501, \u8fdb\u5165\u4e86\u7b49\u5f85\u533a Entry Set, \u65b9\u62ec\u53f7\u5185\u7684\u5730\u5740\u8868\u793a\u7ebf\u7a0b\u7b49\u5f85\u7684\u8d44\u6e90\u5730\u5740;<\/li><li>in Object.wait() [0x&#8230;], \u8868\u793a\u7ebf\u7a0b\u8c03\u7528\u4e86 object.wait(), \u653e\u5f03\u4e86\u5185\u7f6e\u9501, \u8fdb\u5165\u4e86\u7b49\u5f85\u533a Wait Set, \u7b49\u5f85\u88ab\u5524\u9192, \u65b9\u62ec\u53f7\u5185\u7684\u5730\u5740\u8868\u793a\u7ebf\u7a0b\u653e\u5f03\u7684\u8d44\u6e90\u5730\u5740;<\/li><li>waiting on condition [0x&#8230;], \u8868\u793a\u7ebf\u7a0b\u88ab\u963b\u585e\u539f\u8bed\u6240\u963b\u585e, \u65b9\u62ec\u53f7\u5185\u7684\u5730\u5740\u8868\u793a\u7ebf\u7a0b\u7b49\u5f85\u7684\u8d44\u6e90\u5730\u5740; \u8fd9\u79cd\u548c jvm \u7684\u5185\u7f6e\u9501\u4f53\u7cfb\u6ca1\u6709\u5173\u7cfb, \u5b83\u662f jdk5 \u4e4b\u540e\u7684 java.util.concurrent \u5305\u4e0b\u7684\u9501\u673a\u5236\u3002<\/li><\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"-2\">\u7ebf\u7a0b\u7684\u72b6\u6001<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u7ebf\u7a0b\u7684\u72b6\u6001\u8bb0\u5f55\u5728\u6bcf\u4e2a thread dump \u7684\u7b2c\u4e8c\u884c, \u5e76\u4ee5 java.lang.Thread.State \u5f00\u5934, \u4e00\u822c\u60c5\u51b5\u4e0b\u53ef\u5206\u4e3a\u5982\u4e0b\u51e0\u7c7b:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>RUNNABLE, \u8fd9\u79cd\u4e00\u822c\u4e0e\u7ebf\u7a0b\u52a8\u4f5c runnable \u4e00\u8d77\u51fa\u73b0<\/li><li>BLOCKED (on object monitor), \u8fd9\u79cd\u4e00\u822c\u4e0e\u7ebf\u7a0b\u52a8\u4f5c waiting for monitor entry \u4e00\u8d77\u51fa\u73b0, \u4e0d\u8fc7\u5728\u5176\u7ebf\u7a0b\u8c03\u7528\u6808\u6700\u672b\u7aef\u5e76\u6ca1\u6709\u4e00\u4e2a\u56fa\u5b9a\u7684\u65b9\u6cd5, \u56e0\u4e3a synchronized \u5173\u952e\u5b57\u53ef\u4ee5\u4fee\u9970\u5404\u79cd\u65b9\u6cd5\u6216\u8005\u540c\u6b65\u5757<\/li><li>WAITING (on object monitor) \u6216\u8005 TIMED<em>WAITING (on object monitor), \u8fd9\u79cd\u4e00\u822c\u4e0e\u7ebf\u7a0b\u52a8\u4f5c in Object.wait() [0x&#8230;] \u4e00\u8d77\u51fa\u73b0, \u5e76\u4e14\u7ebf\u7a0b\u8c03\u7528\u6808\u7684\u6700\u672b\u7aef\u8c03\u7528\u65b9\u6cd5\u4e3a at java.lang.Object.wait(Native Method), \u4ee5\u8868\u793a object.wait() \u65b9\u6cd5\u7684\u8c03\u7528; \u53e6\u5916, WAITING \u4e0e TIMED<\/em>WAITING \u7684\u533a\u522b\u5728\u4e8e\u662f\u5426\u8bbe\u7f6e\u4e86\u8d85\u65f6\u4e2d\u65ad, \u5373 wait(long timeout) \u4e0e wait() \u7684\u533a\u522b;<\/li><li>WAITING (parking) \u6216\u8005 TIMED<em>WAITING (parking), \u8fd9\u79cd\u4e00\u822c\u4e0e\u7ebf\u7a0b\u52a8\u4f5c waiting on condition [0x&#8230;] \u4e00\u8d77\u51fa\u73b0, \u5e76\u4e14\u7ebf\u7a0b\u8c03\u7528\u6808\u7684\u6700\u672b\u7aef\u8c03\u7528\u65b9\u6cd5\u4e00\u822c\u4e3a at sun.misc.Unsafe.park(Native Method); Unsafe.park \u4f7f\u7528\u7684\u662f\u7ebf\u7a0b\u963b\u585e\u539f\u8bed, \u4e3b\u8981\u5728 java.util.concurrent.locks.AbstractQueuedSynchronizer \u7c7b\u4e2d\u88ab\u4f7f\u7528\u5230, \u5f88\u591a\u57fa\u4e8e AQS \u6784\u5efa\u7684\u540c\u6b65\u5de5\u5177, \u5982 ReentrantLock, Condition, CountDownLatch, Semaphore \u7b49\u90fd\u4f1a\u8bf1\u53d1\u7ebf\u7a0b\u8fdb\u5165\u8be5\u72b6\u6001; \u53e6\u5916, WAITING \u4e0e TIMED<\/em>WAITING \u7684\u533a\u522b\u4e0e\u7b2c\u4e09\u70b9\u4e2d\u63d0\u5230\u7684\u539f\u56e0\u4e00\u81f4;<\/li><\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"-3\">\u7ebf\u7a0b\u7684\u91cd\u8981\u8c03\u7528\u4fee\u9970<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">thread dump \u7684\u7b2c\u4e09\u90e8\u5206\u7ebf\u7a0b\u8c03\u7528\u6808\u4e2d, \u4e00\u822c\u4f1a\u628a\u4e0e\u9501\u76f8\u5173\u7684\u8d44\u6e90\u4f7f\u7528\u72b6\u6001\u4ee5\u9644\u52a0\u7684\u5f62\u5f0f\u4f5c\u91cd\u70b9\u4fee\u9970, \u8fd9\u4e0e\u7ebf\u7a0b\u7684\u52a8\u4f5c\u53ca\u72b6\u6001\u6709\u7740\u5bc6\u5207\u7684\u8054\u7cfb, \u4e00\u822c\u60c5\u51b5\u4e0b\u53ef\u5206\u4e3a\u5982\u4e0b\u51e0\u7c7b:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>locked &lt;0x&#8230;&gt;, \u8868\u793a\u5176\u6210\u529f\u83b7\u53d6\u4e86\u5185\u7f6e\u9501, \u6210\u4e3a\u4e86 owner;<\/li><li>parking to wait for &lt;0x&#8230;&gt;, \u8868\u793a\u5176\u88ab\u963b\u585e\u539f\u8bed\u6240\u963b\u585e, \u901a\u5e38\u4e0e\u7ebf\u7a0b\u52a8\u4f5c waiting on condition \u4e00\u8d77\u51fa\u73b0;<\/li><li>waiting to lock &lt;0x&#8230;&gt;, \u8868\u793a\u5176\u5728 Entry Set \u4e2d\u7b49\u5f85\u67d0\u4e2a\u5185\u7f6e\u9501, \u901a\u5e38\u4e0e\u7ebf\u7a0b\u52a8\u4f5c waiting for monitor entry \u4e00\u8d77\u51fa\u73b0;<\/li><li>waiting on &lt;0x&#8230;&gt;, \u8868\u793a\u5176\u5728 Wait Set \u4e2d\u7b49\u5f85\u88ab\u5524\u9192, \u901a\u5e38\u4e0e\u7ebf\u7a0b\u52a8\u4f5c in Object.wait() [0x&#8230;] \u4e00\u8d77\u51fa\u73b0;<\/li><\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u53e6\u5916, waiting on \u8c03\u7528\u4fee\u9970\u5f80\u5f80\u4e0e locked \u8c03\u7528\u4fee\u9970\u4e00\u540c\u51fa\u73b0, \u5982\u4e4b\u524d\u5217\u4e3e\u7684\u7b2c\u56db\u4e2a thread dump:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>at java.lang.Object.wait(Native Method)\n  - waiting on &lt;0x00007fba6b50ea38&gt; (a java.util.TaskQueue)\n  at java.lang.Object.wait(Object.java:502)\n  at java.util.TimerThread.mainLoop(Timer.java:526)\n  - locked &lt;0x00007fba6b50ea38&gt; (a java.util.TaskQueue)\n  at java.util.TimerThread.run(Timer.java:505)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u662f\u56e0\u4e3a\u8be5\u7ebf\u7a0b\u4e4b\u524d\u83b7\u5f97\u8fc7\u8be5\u5185\u7f6e\u9501, \u73b0\u5728\u56e0\u4e3a object.wait() \u53c8\u5c06\u5176\u653e\u5f03\u4e86, \u6240\u4ee5\u5728\u8c03\u7528\u6808\u4e2d\u4f1a\u51fa\u73b0\u5148\u540e\u4e24\u4e2a\u8c03\u7528\u4fee\u9970\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"-4\">\u6b7b\u9501\u68c0\u6d4b\u7684\u5c55\u793a<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728 jdk5 \u4e4b\u524d, Doug Lea \u5927\u795e\u8fd8\u6ca1\u6709\u53d1\u5e03 java.util.concurrent \u5305, \u8fd9\u4e2a\u65f6\u5019\u63d0\u53ca\u7684\u9501, \u5c31\u4ec5\u9650\u4e8e jvm \u76d1\u89c6\u5668\u5185\u7f6e\u9501; \u6b64\u65f6\u5982\u679c\u8fdb\u7a0b\u5185\u6709\u6b7b\u9501\u53d1\u751f, jstack \u5c06\u4f1a\u628a\u6b7b\u9501\u68c0\u6d4b\u4fe1\u606f\u6253\u5370\u51fa\u6765:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Found one Java-level deadlock:\n=============================\n\"Thread-xxx\":\n  waiting to lock monitor 0x00007f0134003ae8 (object 0x00000007d6aa2c98, a java.lang.Object),\n  which is held by \"Thread-yyy\"\n\"Thread-yyy\":\n  waiting to lock monitor 0x00007f0134006168 (object 0x00000007d6aa2ca8, a java.lang.Object),\n  which is held by \"Thread-xxx\"\n\nJava stack information for the threads listed above:\n===================================================\n\"Thread-xxx\":\n    ...\n\"Thread-yyy\":\n    ...\nFound 1 deadlock.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u7136\u800c\u540e\u6765 Doug Lea \u53d1\u5e03\u4e86 java.util.concurrent \u5305, \u5f53\u8c08\u53ca java \u7684\u9501, \u9664\u4e86\u5185\u7f6e\u9501\u4e4b\u5916\u8fd8\u6709\u4e86\u57fa\u4e8e AbstractOwnableSynchronizer \u7684\u5404\u79cd\u5f62\u5f0f; \u7531\u4e8e\u662f\u65b0\u4e8b\u7269, \u5f7c\u65f6 jdk5 \u7684 jstack \u6ca1\u6709\u53ca\u65f6\u63d0\u4f9b\u5bf9\u4ee5 AQS \u6784\u5efa\u7684\u540c\u6b65\u5de5\u5177\u7684\u6b7b\u9501\u68c0\u6d4b\u529f\u80fd, \u76f4\u5230 jdk6 \u624d\u5b8c\u5584\u4e86\u76f8\u5173\u652f\u6301;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"javajstackdump\">\u5e38\u89c1 java \u8fdb\u7a0b\u7684 jstack dump \u7279\u5f81<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u9996\u5148, \u4e0d\u7ba1\u662f\u4ec0\u4e48\u7c7b\u578b\u7684 java \u5e94\u7528, \u6709\u4e00\u4e9b\u901a\u7528\u7684\u7ebf\u7a0b\u662f\u90fd\u4f1a\u5b58\u5728\u7684:\n<strong>VM Thread \u4e0e VM Periodic Task Thread<\/strong>\n\u865a\u62df\u673a\u7ebf\u7a0b, \u5c5e\u4e8e native thread, \u51cc\u9a7e\u4e0e\u5176\u4ed6\u7528\u6237\u7ebf\u7a0b\u4e4b\u4e0a;\nVM Periodic Task Thread \u901a\u5e38\u7528\u4e8e\u865a\u62df\u673a\u4f5c sampling\/profiling, \u6536\u96c6\u7cfb\u7edf\u8fd0\u884c\u4fe1\u606f, \u4e3a JIT \u4f18\u5316\u4f5c\u51b3\u7b56\u4f9d\u636e;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u4e3b\u7ebf\u7a0b main<\/strong>\n\u901a\u5e38 main \u7ebf\u7a0b\u662f jvm \u521b\u5efa\u7684 1 \u53f7\u7528\u6237\u7ebf\u7a0b, \u6709\u4e86 main \u4e4b\u540e\u624d\u6709\u4e86\u540e\u6765\u7684\u5176\u4ed6\u7528\u6237\u7ebf\u7a0b;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Reference Handler \u7ebf\u7a0b\u4e0e Finalizer \u7ebf\u7a0b<\/strong>\n\u8fd9\u4e24\u4e2a\u7ebf\u7a0b\u7528\u4e8e\u865a\u62df\u673a\u5904\u7406 override \u4e86 Object.finalize() \u65b9\u6cd5\u7684\u5b9e\u4f8b, \u5bf9\u5b9e\u4f8b\u56de\u6536\u524d\u4f5c\u6700\u540e\u7684\u5224\u51b3\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\"Reference Handler\" #2 daemon prio=10 os_prio=0 tid=0x00007f91e007f000 nid=0xa80 in Object.wait() [0x...]\n   java.lang.Thread.State: WAITING (on object monitor)\n        at java.lang.Object.wait(Native Method)\n        at java.lang.Object.wait(Object.java:502)\n        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:157)\n        - locked &lt;0x00000000c0495140&gt; (a java.lang.ref.Reference$Lock)<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>\"Finalizer\" #3 daemon prio=8 os_prio=0 tid=0x00007f91e0081000 nid=0xa81 in Object.wait() [0x...]\n   java.lang.Thread.State: WAITING (on object monitor)\n        at java.lang.Object.wait(Native Method)\n        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)\n        - locked &lt;0x00000000c008db88&gt; (a java.lang.ref.ReferenceQueue$Lock)\n        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)\n        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"threaddump\">\u4f7f\u7528\u4ee3\u7801\u4f5c thread dump<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u9664\u4e86\u4f7f\u7528 jstack \u4e4b\u5916, \u8fd8\u6709\u5176\u4ed6\u4e00\u4e9b\u65b9\u6cd5\u53ef\u4ee5\u5bf9 java \u8fdb\u7a0b\u4f5c thread dump, \u5982\u679c\u5c06\u5176\u5c01\u88c5\u4e3a http \u63a5\u53e3, \u4fbf\u53ef\u4ee5\u4e0d\u7528\u767b\u9646\u4e3b\u673a, \u76f4\u63a5\u5728\u6d4f\u89c8\u5668\u4e0a\u67e5\u8be2 thread dump \u7684\u60c5\u51b5\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u4f7f\u7528 jmx \u7684 api<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public void  threadDump() {\n   ThreadMXBean threadMxBean = ManagementFactory.getThreadMXBean();\n   for (ThreadInfo threadInfo : threadMxBean.dumpAllThreads(true, true)) {\n       \/\/ deal with threadInfo.toString()\n   }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u4f7f\u7528 Thread.getAllStackTraces() \u65b9\u6cd5<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public void threadDump() {\n    for (Map.Entry&lt;Thread, StackTraceElement[]&gt; stackTrace : Thread.getAllStackTraces().entrySet()) {\n        Thread thread = (Thread) stackTrace.getKey();\n        StackTraceElement[] stack = (StackTraceElement[]) stackTrace.getValue();\n        if (thread.equals(Thread.currentThread())) {\n            continue;\n        }\n        \/\/ deal with thread\n        for (StackTraceElement stackTraceElement : stack) {\n            \/\/ deal with stackTraceElement\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"-5\">\u7ebf\u7a0b\u6027\u80fd\u8bca\u65ad\u7684\u8f85\u52a9\u811a\u672c<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u64cd\u4f5c\u6b65\u9aa4\u548c\u5f88\u591a\u6559\u7a0b\u90fd\u662f\u4e00\u6837\uff0c\u53ea\u4e0d\u8fc7\uff0c\u6211\u628a\u5b83\u7b80\u5316\u6210\u4e86\u4e00\u4e2a\u811a\u672c\u3002\u6211\u5728\u7b80\u5355\u91cd\u590d\u4e00\u4e0b\u5b83\u7684\u4e3b\u8981\u6b65\u9aa4\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f7f\u7528 jstack \u8fd8\u6709\u4e00\u4e2a\u91cd\u8981\u7684\u529f\u80fd\u5c31\u662f\u5206\u6790\u70ed\u70b9\u7ebf\u7a0b: \u627e\u51fa\u5360\u7528 cpu \u8d44\u6e90\u6700\u9ad8\u7684\u7ebf\u7a0b;\n\u9996\u5148\u6211\u5148\u4ecb\u7ecd\u4e00\u4e0b\u624b\u5de5\u6572\u547d\u4ee4\u5206\u6790\u7684\u65b9\u6cd5:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>* \u4f7f\u7528 top \u547d\u4ee4\u627e\u51fa cpu \u4f7f\u7528\u7387\u9ad8\u7684 thread id:<\/em>*<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># -p pid: \u53ea\u663e\u793a\u6307\u5b9a\u8fdb\u7a0b\u7684\u4fe1\u606f\n# -H: \u5c55\u793a\u7ebf\u7a0b\u7684\u8be6\u7ec6\u4fe1\u606f\ntop -H -p {pid}\n# \u4f7f\u7528 P \u5feb\u6377\u952e\u6309 cpu \u4f7f\u7528\u7387\u6392\u5e8f, \u5e76\u8bb0\u5f55\u6392\u5e8f\u9760\u524d\u7684\u82e5\u5e72 pid (\u8f7b\u91cf\u7ea7\u8fdb\u7a0b id)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u4f5c\u8fdb\u5236\u8f6c\u6362:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \u5c06\u8bb0\u5f55\u4e0b\u7684\u5341\u8fdb\u5236 pid \u8f6c\u4e3a\u5341\u516d\u8fdb\u5236\nthread_id_0x=`printf \"%x\" $thread_id`\n`echo \"obase=16; $thread_id\" | bc`<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u7531\u4e8e thread dump \u4e2d\u8bb0\u5f55\u7684\u6bcf\u4e2a\u7ebf\u7a0b\u7684 nid \u662f\u4e0e linux \u8f7b\u91cf\u7ea7\u8fdb\u7a0b pid \u4e00\u4e00\u5bf9\u5e94\u7684 (\u53ea\u662f\u5341\u8fdb\u5236\u4e0e\u5341\u516d\u8fdb\u5236\u7684\u533a\u522b), \u6240\u4ee5\u4fbf\u53ef\u4ee5\u62ff\u8f6c\u6362\u5f97\u5230\u7684\u5341\u516d\u8fdb\u5236 thread<em>id<\/em>0x, \u53bb thread dump \u4e2d\u641c\u7d22\u5bf9\u5e94\u7684 nid, \u5b9a\u4f4d\u95ee\u9898\u7ebf\u7a0b\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/sh\n\ndefault_lines=10\ntop_head_info_padding_lines=8\ndefault_stack_lines=15\n\njvm_pid=$1\njvm_user=$2\n((thread_stack_lines=${3:-$default_lines}+top_head_info_padding_lines))\n\nthreads_top_capture=$(top -b -n1 -H -p $jvm_pid | grep $jvm_user | head -n $thread_stack_lines)\njstack_output=$(echo \"$(sudo -i -u $jvm_user jstack $jvm_pid)\")\ntop_output=$(echo \"$(echo \"$threads_top_capture\" | perl -pe 's\/\\e\\[?.*?[\\@-~] ?\/\/g' | awk '{gsub(\/^ +\/,\"\");print}' | awk '{gsub(\/ +|[+-]\/,\" \");print}' | cut -d \" \" -f 1,9 )\\n \")\n\necho \"***********************************************************\"\nuptime\necho \"Analyzing top $top_threads threads\"\necho \"***********************************************************\"\n\nprintf %s \"$top_output\" | while IFS= read line\ndo\n    pid=$(echo $line | cut -d \" \" -f 1)\n    hexapid=$(printf \"%x\" $pid)\n    cpu=$(echo $line | cut -d \" \" -f 2)\n    echo -n $cpu \"% [$pid] \"\n    echo \"$jstack_output\" | grep \"tid.*0x$hexapid \" -A $default_stack_lines | sed -n -e '\/0x'$hexapid'\/,\/tid\/ p' | head -n -1\ndone<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8be5\u811a\u672c\u7684\u4e3b\u8981\u529f\u80fd\u662f: \u6309\u7167 cpu \u4f7f\u7528\u7387\u4ece\u9ad8\u5230\u4f4e\u6392\u5e8f, \u6253\u5370\u6307\u5b9a jvm \u8fdb\u7a0b\u7684\u524d n \u4e2a\u7ebf\u7a0b\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e0d\u61c2 shell \u7684\uff0c\u53ef\u4ee5\u540e\u53f0\u56de\u590d\u201cshell\u201d\u83b7\u53d6\u89c6\u9891\u6559\u7a0b\u3002\u6216\u52a0\u6211WX\uff1acodedq\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"threaddump-1\">thread dump \u53ef\u89c6\u5316\u5206\u6790\u5de5\u5177<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">dump \u53ef\u89c6\u5316\u5de5\u5177\u6bd4\u8f83\u591a\uff0c\u8fd9\u91cc\u63a8\u8350\u4e24\u4e2a\u6211\u5e38\u7528\u7684\u3002gceasy.io \u548c fastthread.io\u3002<\/p>\n<!-- <audio autoplay=\"autoplay\" height=\"100\" width=\"100\" hidden=\"true\"><source src=\"https:\/\/c.coka.la\/orAvPR.mp3\" type=\"audio\/mp3\"\/><\/audio><img decoding=\"async\" src=\"https:\/\/images.weserv.nl\/?url=https:\/\/ws3.sinaimg.cn\/large\/8fa5dcfcgy1g4em3rzar5j20ib089ae0.jpg\" alt=\"\u4e1a\u4f59\u8349\u516c\u4f17\u53f7\"\/> --><p><!-- <img decoding=\"async\" src=\"https:\/\/raw.githubusercontent.com\/xmt1139057136\/xttblog\/master\/8fa5dcfcgy1g4em3rzar5j20ib089ae0.jpg\" alt=\"\u4e1a\u4f59\u8349\u516c\u4f17\u53f7\"\/>--><img decoding=\"async\" src=\"https:\/\/saas.51autoparts.cn\/api\/admin\/sys-file\/oss\/file?fileName=84db51f8561e448f9a4fda2eff0811f9.jpg\" alt=\"\u4e1a\u4f59\u8349\u516c\u4f17\u53f7\"\/><\/p><p>\u6700\u540e\uff0c\u6b22\u8fce\u5173\u6ce8\u6211\u7684\u4e2a\u4eba\u5fae\u4fe1\u516c\u4f17\u53f7\uff1a\u4e1a\u4f59\u8349\uff08yyucao\uff09\uff01<b>\u53ef\u52a0\u4f5c\u8005\u5fae\u4fe1\u53f7\uff1a<font color=\"red\">xttblog2<\/font>\u3002\u5907\u6ce8\uff1a\u201c1\u201d\uff0c\u6dfb\u52a0\u535a\u4e3b\u5fae\u4fe1\u62c9\u4f60\u8fdb\u5fae\u4fe1\u7fa4\u3002\u5907\u6ce8\u9519\u8bef\u4e0d\u4f1a\u540c\u610f\u597d\u53cb\u7533\u8bf7\u3002<\/b>\u518d\u6b21\u611f\u8c22\u60a8\u7684\u5173\u6ce8\uff01\u540e\u7eed\u6709\u7cbe\u5f69\u5185\u5bb9\u4f1a\u7b2c\u4e00\u65f6\u95f4\u53d1\u7ed9\u60a8\uff01\u539f\u521b\u6587\u7ae0\u6295\u7a3f\u8bf7\u53d1\u9001\u81f3532009913@qq.com\u90ae\u7bb1\u3002\u5546\u52a1\u5408\u4f5c\u4e5f\u53ef\u6dfb\u52a0\u4f5c\u8005\u5fae\u4fe1\u8fdb\u884c\u8054\u7cfb\uff01<\/p><p>\u672c\u6587\u539f\u6587\u51fa\u5904\uff1a<a href=\"https:\/\/www.xttblog.com\">\u4e1a\u4f59\u8349<\/a>\uff1a &raquo; <a href=\"https:\/\/www.xttblog.com\/?p=4946\">jstack \u547d\u4ee4\u4f7f\u7528\u7ecf\u9a8c\u603b\u7ed3\u548c\u7ebf\u7a0b\u6027\u80fd\u8bca\u65ad\u811a\u672c<\/a><\/p><!-- <div class=\"bd-reward-stl\"><button id=\"bdRewardBtn\"><span><\/span><\/button><\/div> -->","protected":false},"excerpt":{"rendered":"<p>\u5206\u4eab\u4e00\u4e0b\uff0cjstack \u547d\u4ee4\u4f7f\u7528\u7ecf\u9a8c\u603b\u7ed3\u3002 jstack \u5728\u547d\u4ee4\u4f7f\u7528\u4e0a\u5341\u5206\u7b80\u6d01, \u7136\u800c\u5176\u8f93\u51fa\u7684\u5185\u5bb9\u5374\u5341\u5206\u4e30\u5bcc, [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[1176,201,945,706,2100],"class_list":["post-4946","post","type-post","status-publish","format-standard","hentry","category-java","tag-dump","tag-jstack","tag-linux","tag-shell"],"_links":{"self":[{"href":"https:\/\/www.xttblog.com\/index.php?rest_route=\/wp\/v2\/posts\/4946","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xttblog.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xttblog.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xttblog.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xttblog.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4946"}],"version-history":[{"count":3,"href":"https:\/\/www.xttblog.com\/index.php?rest_route=\/wp\/v2\/posts\/4946\/revisions"}],"predecessor-version":[{"id":4949,"href":"https:\/\/www.xttblog.com\/index.php?rest_route=\/wp\/v2\/posts\/4946\/revisions\/4949"}],"wp:attachment":[{"href":"https:\/\/www.xttblog.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4946"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xttblog.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4946"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xttblog.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4946"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}