{"id":5832,"date":"2024-08-30T10:01:03","date_gmt":"2024-08-30T02:01:03","guid":{"rendered":""},"modified":"2024-08-30T10:01:03","modified_gmt":"2024-08-30T02:01:03","slug":"\u963f\u91cc\u8bca\u65ad\u5de5\u5177arthas_\u963f\u91cc\u8fd0\u8425","status":"publish","type":"post","link":"https:\/\/mushiming.com\/5832.html","title":{"rendered":"\u963f\u91cc\u8bca\u65ad\u5de5\u5177arthas_\u963f\u91cc\u8fd0\u8425"},"content":{"rendered":"
\n

\u957f\u6587\u9884\u8b66\uff01\uff01\uff01<\/p>\n

Arthas \u662fAlibaba\u5f00\u6e90\u7684Java\u8bca\u65ad\u5de5\u5177\u3002\u5728\u7ebf\u6392\u67e5\u95ee\u9898\uff0c\u65e0\u9700\u91cd\u542f\uff1b\u52a8\u6001\u8ddf\u8e2aJava\u4ee3\u7801\uff1b\u5b9e\u65f6\u76d1\u63a7JVM\u72b6\u6001\u3002\u5bf9\u5206\u79d2\u5fc5\u4e89\u7684\u7ebf\u4e0a\u5f02\u5e38\uff0c Arthas\u53ef\u5e2e\u52a9\u6211\u4eec\u5feb\u901f\u8bca\u65ad\u76f8\u5173\u95ee\u9898\u3002<\/p>\n

\u516c\u53f8\u6709\u4e2a\u6e20\u9053\u7cfb\u7edf\uff0c\u4e13\u95e8\u5bf9\u63a5\u4e09\u65b9\u6e20\u9053\u4f7f\u7528\uff0c\u6ca1\u6709\u4ec0\u4e48\u4e1a\u52a1\u903b\u8f91\uff0c\u4e3b\u8981\u662f\u8f6c\u6362\u62a5\u6587\u548c\u53c2\u6570\u6821\u9a8c\u4e4b\u7c7b\u7684\u5de5\u4f5c\uff0c\u8d77\u7740\u4e00\u4e2a\u627f\u4e0a\u542f\u4e0b\u7684\u4f5c\u7528\u3002<\/p>\n

\u6700\u8fd1\u5728\u4f18\u5316\u63a5\u53e3\u7684\u54cd\u5e94\u65f6\u95f4\uff0c\u4f18\u5316\u4e86\u4ee3\u7801\u4e4b\u540e\uff0c\u4f46\u662f\u65f6\u95f4\u8fd8\u662f\u8fbe\u4e0d\u5230\u8981\u6c42\uff1b\u6709\u4e00\u4e2a\u8be1\u5f02\u7684100ms\u5de6\u53f3\u7684\u8017\u65f6\u95ee\u9898\uff0c\u5728\u63a5\u53e3\u4e2d\u6253\u5370\u4e86\u8bf7\u6c42\u5904\u7406\u65f6\u95f4\u540e\uff0c\u548c\u8c03\u7528\u65b9\u7684\u54cd\u5e94\u65f6\u95f4\u8fd8\u6709\u5dee\u4e86100ms\u5de6\u53f3\u3002\u6bd4\u5982\u7a0b\u5e8f\u91cc\u8bb0\u5f55150ms\uff0c\u4f46\u662f\u8c03\u7528\u65b9\u7b49\u5f85\u65f6\u95f4\u5374\u4e3a250ms\u5de6\u53f3\u3002<\/p>\n

\u4e0b\u9762\u8bb0\u5f55\u4e0b\u5f53\u65f6\u8be6\u7ec6\u7684\u5b9a\u4f4d&\u89e3\u51b3\u6d41\u7a0b\uff08\u5176\u5b9e\u89e3\u51b3\u5f88\u7b80\u5355\uff0c\u5173\u952e\u5728\u4e8e\u600e\u4e48\u5b9a\u4f4d\u5e76\u627e\u5230\u89e3\u51b3\u95ee\u9898\u7684\u65b9\u6cd5\uff09<\/p>\n

\u5b9a\u4f4d\u8fc7\u7a0b<\/strong><\/h3>\n

\u5206\u6790\u4ee3\u7801<\/strong><\/h3>\n

\u6e20\u9053\u7cfb\u7edf\u662f\u4e00\u4e2a\u5e38\u89c1\u7684spring-boot web\u5de5\u7a0b\uff0c\u4f7f\u7528\u4e86\u96c6\u6210\u7684tomcat\u3002\u5206\u6790\u4e86\u4ee3\u7801\u4e4b\u540e\uff0c\u53d1\u73b0\u5e76\u6ca1\u6709\u7279\u6b8a\u7684\u5730\u65b9\uff0c\u6ca1\u6709\u7279\u6b8a\u7684\u8fc7\u6ee4\u5668\u6216\u8005\u62e6\u622a\u5668\uff0c\u6240\u4ee5\u521d\u6b65\u6392\u9664\u662f\u4e1a\u52a1\u4ee3\u7801\u95ee\u9898<\/p>\n

\u5206\u6790\u8c03\u7528\u6d41\u7a0b<\/strong><\/h4>\n

\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4e4b\u540e\uff0c\u9996\u5148\u786e\u8ba4\u4e86\u4e0b\u63a5\u53e3\u7684\u8c03\u7528\u6d41\u7a0b\u3002\u7531\u4e8e\u662f\u5185\u90e8\u6d4b\u8bd5\uff0c\u6240\u4ee5\u8c03\u7528\u6d41\u7a0b\u8f83\u5c11\u3002<\/p>\n

Nginx-\u53cd\u5411\u4ee3\u7406->\u6e20\u9053\u7cfb\u7edf<\/code><\/p>\n

\u516c\u53f8\u662f\u4e91\u670d\u52a1\u5668\uff0c\u7f51\u7edc\u8d70\u7684\u4e5f\u662f\u4e91\u7684\u5185\u7f51\u3002\u7531\u4e8e\u4e0d\u660e\u786e\u95ee\u9898\u7684\u539f\u56e0\uff0c\u6240\u4ee5\u7528\u6392\u9664\u6cd5\uff0c\u9996\u5148\u786e\u8ba4\u670d\u52a1\u5668\u7f51\u7edc\u662f\u5426\u6709\u95ee\u9898\u3002<\/p>\n

\u5148\u786e\u8ba4\u53d1\u9001\u7aef\u5230Nginx Host\u662f\u5426\u6709\u95ee\u9898\uff1a<\/p>\n

[jboss@VM_0_139_centos ~]$ ping 10.0.0.139 PING 10.0.0.139(10.0.0.139) 56(84) bytes of data. 64 bytes from10.0.0.139: icmp_seq=1 ttl=64 time=0.029 ms 64 bytes from10.0.0.139: icmp_seq=2 ttl=64 time=0.041 ms 64 bytes from10.0.0.139: icmp_seq=3 ttl=64 time=0.040 ms 64 bytes from10.0.0.139: icmp_seq=4 ttl=64 time=0.040 ms <\/code><\/pre>\n

\u4eceping\u7ed3\u679c\u4e0a\u770b\uff0c\u53d1\u9001\u7aef\u5230Nginx\u4e3b\u673a\u7684\u5ef6\u8fdf\u662f\u65e0\u95ee\u9898\u7684\uff0c\u63a5\u4e0b\u6765\u67e5\u770bNginx\u5230\u6e20\u9053\u7cfb\u7edf\u7684\u7f51\u7edc\u3002<\/p>\n

# \u7531\u4e8e\u65e5\u5fd7\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u8fd9\u91cc\u76f4\u63a5\u590d\u5236\u4e0a\u9762\u65e5\u5fd7\u4e86 [jboss@VM_0_139_centos ~]$ ping 10.0.0.139 PING 10.0.0.139(10.0.0.139) 56(84) bytes of data. 64 bytes from10.0.0.139: icmp_seq=1 ttl=64 time=0.029 ms 64 bytes from10.0.0.139: icmp_seq=2 ttl=64 time=0.041 ms 64 bytes from10.0.0.139: icmp_seq=3 ttl=64 time=0.040 ms 64 bytes from10.0.0.139: icmp_seq=4 ttl=64 time=0.040 ms <\/code><\/pre>\n

\u4eceping\u7ed3\u679c\u4e0a\u770b\uff0cNginx\u5230\u6e20\u9053\u7cfb\u7edf\u670d\u52a1\u5668\u7f51\u7edc\u5ef6\u8fdf\u4e5f\u662f\u6ca1\u95ee\u9898\u7684<\/p>\n

\u65e2\u7136\u7f51\u7edc\u770b\u4f3c\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u53ef\u4ee5\u7ee7\u7eed\u6392\u9664\u6cd5\uff0c\u780d\u6389Nginx\uff0c\u5ba2\u6237\u7aef\u76f4\u63a5\u518d\u6e20\u9053\u7cfb\u7edf\u7684\u670d\u52a1\u5668\u4e0a\uff0c\u901a\u8fc7\u56de\u73af\u5730\u5740\uff08localhost\uff09\u76f4\u8fde\uff0c\u907f\u514d\u7ecf\u8fc7\u7f51\u5361\/dns\uff0c\u7f29\u5c0f\u95ee\u9898\u8303\u56f4\u770b\u770b\u80fd\u5426\u590d\u73b0\uff08\u8fd9\u4e2a\u5e94\u7528\u548c\u5730\u5740\u662f\u6211\u540e\u671f\u6a21\u62df\u7684\uff0c\u6d4b\u8bd5\u7684\u662f\u4e00\u4e2a\u7a7a\u63a5\u53e3\uff09\uff1a<\/p>\n

[jboss@VM_10_91_centos tmp]$ curl -w \"@curl-time.txt\" http:\/\/127.0.0.1:7744\/send success http: 200 dns: 0.001s redirect: 0.000s time_connect: 0.001s time_appconnect: 0.000s time_pretransfer: 0.001s time_starttransfer: 0.073s size_download: 7bytes speed_download: 95.000B\/s ---------- time_total: 0.073s\u8bf7\u6c42\u603b\u8017\u65f6 <\/code><\/pre>\n

\u4ececurl\u65e5\u5fd7\u4e0a\u770b\uff0c\u901a\u8fc7\u56de\u73af\u5730\u5740\u8c03\u7528\u4e00\u4e2a\u7a7a\u63a5\u53e3\u8017\u65f6\u4e5f\u670973ms\u3002\u8fd9\u5c31\u5947\u602a\u4e86\uff0c\u8df3\u8fc7\u4e86\u4e2d\u95f4\u6240\u6709\u8c03\u7528\u8282\u70b9\uff08\u5305\u62ec\u8fc7\u6ee4\u5668&\u62e6\u622a\u5668\u4e4b\u7c7b\uff09\uff0c\u76f4\u63a5\u8bf7\u6c42\u5e94\u7528\u4e00\u4e2a\u7a7a\u63a5\u53e3\uff0c\u90fd\u670973ms\u7684\u8017\u65f6\uff0c\u518d\u8bf7\u6c42\u4e00\u6b21\u770b\u770b\uff1a<\/p>\n

[jboss@VM_10_91_centos tmp]$ curl -w \"@curl-time.txt\" http:\/\/127.0.0.1:7744\/send success http: 200 dns: 0.001s redirect: 0.000s time_connect: 0.001s time_appconnect: 0.000s time_pretransfer: 0.001s time_starttransfer: 0.003s size_download: 7bytes speed_download: 2611.000B\/s ---------- time_total: 0.003s <\/code><\/pre>\n

\u66f4\u5947\u602a\u7684\u662f\uff0c\u7b2c\u4e8c\u6b21\u8bf7\u6c42\u8017\u65f6\u5c31\u6b63\u5e38\u4e86\uff0c\u53d8\u6210\u4e863ms\u3002\u7ecf\u67e5\u9605\u8d44\u6599\uff0clinux curl\u662f\u9ed8\u8ba4\u5f00\u542fhttp keep-alive\u7684\uff08Keep-Alive\u7684\u4ecb\u7ecd\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u4e00\u7bc7\u6587\u7ae0\uff09\u3002\u5c31\u7b97\u4e0d\u5f00\u542fkeep-alive\uff0c\u6bcf\u6b21\u91cd\u65b0handshake\uff0c\u4e5f\u4e0d\u81f3\u4e8e\u9700\u898170ms\u3002<\/p>\n

\u7ecf\u8fc7\u4e0d\u65ad\u5206\u6790\u6d4b\u8bd5\u53d1\u73b0\uff0c\u8fde\u7eed\u8bf7\u6c42\u7684\u8bdd\u65f6\u95f4\u5c31\u4f1a\u5f88\u77ed\uff0c\u6bcf\u6b21\u8bf7\u6c42\u53ea\u9700\u8981\u51e0\u6beb\u79d2\uff0c\u4f46\u662f\u5982\u679c\u9694\u4e00\u6bb5\u65f6\u95f4\u518d\u8bf7\u6c42\uff0c\u5c31\u4f1a\u82b1\u8d3970ms\u4ee5\u4e0a\u3002<\/p>\n

\u4ece\u8fd9\u4e2a\u73b0\u8c61\u731c\u60f3\uff0c\u53ef\u80fd\u662f\u67d0\u4e9b\u7f13\u5b58\u673a\u5236\u5bfc\u81f4\u7684\uff0c\u8fde\u7eed\u8bf7\u6c42\u56e0\u4e3a\u6709\u7f13\u5b58\uff0c\u6240\u4ee5\u901f\u5ea6\u5feb\uff0c\u65f6\u95f4\u957f\u7f13\u5b58\u5931\u6548\u540e\u5bfc\u81f4\u65f6\u95f4\u957f\u3002\u6574\u7f16\uff1a\u5fae\u4fe1\u516c\u4f17\u53f7\uff0c\u4e1a\u4f59\u8349<\/p>\n

\u90a3\u4e48\u8fd9\u4e2a\u95ee\u9898\u70b9\u5230\u5e95\u5728\u54ea\u4e00\u5c42\u5462\uff1ftomcat\u5c42\u8fd8\u662fspring-webmvc\u5462\uff1f<\/p>\n

\u5149\u731c\u60f3\u5b9a\u4f4d\u4e0d\u4e86\u95ee\u9898\uff0c\u8fd8\u662f\u5f97\u5b9e\u9645\u6d4b\u8bd5\u4e00\u4e0b\uff0c\u628a\u6e20\u9053\u7cfb\u7edf\u7684\u4ee3\u7801\u653e\u5230\u672c\u5730ide\u91cc\u542f\u52a8\u6d4b\u8bd5\u80fd\u5426\u590d\u73b0<\/p>\n

\u4f46\u662f\u5bfc\u5165\u672c\u5730Ide\u540e\uff0c\u5728Ide\u4e2d\u542f\u52a8\u540e\u5e76\u4e0d\u80fd\u590d\u73b0\u95ee\u9898\uff0c\u5e76\u6ca1\u670970+ms\u7684\u5ef6\u8fdf\u95ee\u9898\u3002\u8fd9\u4e0b\u5934\u75bc\u4e86\uff0c\u672c\u5730\u65e0\u6cd5\u590d\u73b0\uff0c\u4e0d\u80fdDebug\uff0c\u7531\u4e8e\u95ee\u9898\u70b9\u4e0d\u5728\u4e1a\u52a1\u4ee3\u7801\uff0c\u4e5f\u4e0d\u80fd\u901a\u8fc7\u52a0\u65e5\u5fd7\u7684\u65b9\u5f0f\u6765Debug<\/p>\n

\u8fd9\u65f6\u5019\u53ef\u4ee5\u796d\u51fa\u795e\u5668Arthas\u4e86<\/p>\n

Arthas \u662fAlibaba\u5f00\u6e90\u7684Java\u8bca\u65ad\u5de5\u5177\u3002\u5728\u7ebf\u6392\u67e5\u95ee\u9898\uff0c\u65e0\u9700\u91cd\u542f\uff1b\u52a8\u6001\u8ddf\u8e2aJava\u4ee3\u7801\uff1b\u5b9e\u65f6\u76d1\u63a7JVM\u72b6\u6001\u3002\u5bf9\u5206\u79d2\u5fc5\u4e89\u7684\u7ebf\u4e0a\u5f02\u5e38\uff0c Arthas\u53ef\u5e2e\u52a9\u6211\u4eec\u5feb\u901f\u8bca\u65ad\u76f8\u5173\u95ee\u9898\u3002<\/p>\n

Arthas\u5206\u6790\u95ee\u9898<\/strong><\/h4>\n
\n

Arthas \u662fAlibaba\u5f00\u6e90\u7684Java\u8bca\u65ad\u5de5\u5177\uff0c\u6df1\u53d7\u5f00\u53d1\u8005\u559c\u7231\u3002<\/p>\n

\u5f53\u4f60\u9047\u5230\u4ee5\u4e0b\u7c7b\u4f3c\u95ee\u9898\u800c\u675f\u624b\u65e0\u7b56\u65f6\uff0cArthas\u53ef\u4ee5\u5e2e\u52a9\u4f60\u89e3\u51b3\uff1a<\/p>\n

\u8fd9\u4e2a\u7c7b\u4ece\u54ea\u4e2a jar \u5305\u52a0\u8f7d\u7684\uff1f\u4e3a\u4ec0\u4e48\u4f1a\u62a5\u5404\u79cd\u7c7b\u76f8\u5173\u7684 Exception\uff1f\u6211\u6539\u7684\u4ee3\u7801\u4e3a\u4ec0\u4e48\u6ca1\u6709\u6267\u884c\u5230\uff1f\u96be\u9053\u662f\u6211\u6ca1 commit\uff1f\u5206\u652f\u641e\u9519\u4e86\uff1f\u9047\u5230\u95ee\u9898\u65e0\u6cd5\u5728\u7ebf\u4e0a debug\uff0c\u96be\u9053\u53ea\u80fd\u901a\u8fc7\u52a0\u65e5\u5fd7\u518d\u91cd\u65b0\u53d1\u5e03\u5417\uff1f\u7ebf\u4e0a\u9047\u5230\u67d0\u4e2a\u7528\u6237\u7684\u6570\u636e\u5904\u7406\u6709\u95ee\u9898\uff0c\u4f46\u7ebf\u4e0a\u540c\u6837\u65e0\u6cd5 debug\uff0c\u7ebf\u4e0b\u65e0\u6cd5\u91cd\u73b0\uff01\u662f\u5426\u6709\u4e00\u4e2a\u5168\u5c40\u89c6\u89d2\u6765\u67e5\u770b\u7cfb\u7edf\u7684\u8fd0\u884c\u72b6\u51b5\uff1f\u6709\u4ec0\u4e48\u529e\u6cd5\u53ef\u4ee5\u76d1\u63a7\u5230JVM\u7684\u5b9e\u65f6\u8fd0\u884c\u72b6\u6001\uff1f<\/p>\n<\/blockquote>\n

\u4e0a\u9762\u662fArthas\u7684\u5b98\u65b9\u7b80\u4ecb\uff0c\u8fd9\u6b21\u6211\u53ea\u9700\u8981\u7528\u4ed6\u7684\u4e00\u4e2a\u5c0f\u529f\u80fdtrace\u3002\u52a8\u6001\u8ba1\u7b97\u65b9\u6cd5\u8c03\u7528\u8def\u5f84\u548c\u65f6\u95f4\uff0c\u8fd9\u6837\u6211\u5c31\u53ef\u4ee5\u5b9a\u4f4d\u65f6\u95f4\u5728\u54ea\u4e2a\u5730\u65b9\u88ab\u6d88\u8017\u4e86\u3002<\/p>\n

\n

trace \u65b9\u6cd5\u5185\u90e8\u8c03\u7528\u8def\u5f84\uff0c\u5e76\u8f93\u51fa\u65b9\u6cd5\u8def\u5f84\u4e0a\u7684\u6bcf\u4e2a\u8282\u70b9\u4e0a\u8017\u65f6<\/p>\n

trace \u547d\u4ee4\u80fd\u4e3b\u52a8\u641c\u7d22 class-pattern\uff0fmethod-pattern \u5bf9\u5e94\u7684\u65b9\u6cd5\u8c03\u7528\u8def\u5f84\uff0c\u6e32\u67d3\u548c\u7edf\u8ba1\u6574\u4e2a\u8c03\u7528\u94fe\u8def\u4e0a\u7684\u6240\u6709\u6027\u80fd\u5f00\u9500\u548c\u8ffd\u8e2a\u8c03\u7528\u94fe\u8def\u3002<\/p>\n<\/blockquote>\n

\u6709\u4e86\u795e\u5668\uff0c\u90a3\u4e48\u8be5\u8ffd\u8e2a\u4ec0\u4e48\u65b9\u6cd5\u5462\uff1f\u7531\u4e8e\u6211\u5bf9Tomcat\u6e90\u7801\u4e0d\u662f\u5f88\u719f\uff0c\u6240\u4ee5\u53ea\u80fd\u4ecespring mvc\u4e0b\u624b\uff0c\u5148\u6765trace\u4e00\u4e0bspring mvc\u7684\u5165\u53e3\uff1a<\/p>\n

[arthas@24851]$ trace org.springframework.web.servlet.DispatcherServlet* Press Q orCtrl+C to abort. Affect(class-cnt:1, method-cnt:44) cost in508 ms. `---ts=2019-09-14 21:07:44;thread_name=http-nio-7744-exec-2;id=11;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@7c `---[2.ms] org.springframework.web.servlet.DispatcherServlet:buildLocaleContext() `---ts=2019-09-14 21:07:44;thread_name=http-nio-7744-exec-2;id=11;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@7c `---[18.08903ms] org.springframework.web.servlet.DispatcherServlet:doService() +---[0.041346ms] org.apache.commons.logging.Log:isDebugEnabled() #889 +---[0.022398ms] org.springframework.web.util.WebUtils:isIncludeRequest() #898 +---[0.014904ms] org.springframework.web.servlet.DispatcherServlet:getWebApplicationContext() #910 +---[1.071879ms] javax.servlet.http.HttpServletRequest:setAttribute() #910 +---[0.020977ms] javax.servlet.http.HttpServletRequest:setAttribute() #911 +---[0.017073ms] javax.servlet.http.HttpServletRequest:setAttribute() #912 +---[0.ms] org.springframework.web.servlet.DispatcherServlet:getThemeSource() #913 | `---[0.ms] org.springframework.web.servlet.DispatcherServlet:getThemeSource() | `---[min=0.00783ms,max=0.014251ms,total=0.022081ms,count=2] org.springframework.web.servlet.DispatcherServlet:getWebApplicationContext() #782 +---[0.019363ms] javax.servlet.http.HttpServletRequest:setAttribute() #913 +---[0.070694ms] org.springframework.web.servlet.FlashMapManager:retrieveAndUpdate() #916 +---[0.01839ms] org.springframework.web.servlet.FlashMap:<init>() #920 +---[0.016943ms] javax.servlet.http.HttpServletRequest:setAttribute() #920 +---[0.015268ms] javax.servlet.http.HttpServletRequest:setAttribute() #921 +---[15.050124ms] org.springframework.web.servlet.DispatcherServlet:doDispatch() #925 | `---[14.ms] org.springframework.web.servlet.DispatcherServlet:doDispatch() | +---[0.019135ms] org.springframework.web.context.request.async.WebAsyncUtils:getAsyncManager() #953 | +---[2.ms] org.springframework.web.servlet.DispatcherServlet:checkMultipart() #960 | | `---[2.004436ms] org.springframework.web.servlet.DispatcherServlet:checkMultipart() | | `---[1.ms] org.springframework.web.multipart.MultipartResolver:isMultipart() #1117 | +---[2.054361ms] org.springframework.web.servlet.DispatcherServlet:getHandler() #964 | | `---[1.ms] org.springframework.web.servlet.DispatcherServlet:getHandler() | | +---[0.02051ms] java.util.List:iterator() #1183 | | +---[min=0.003805ms,max=0.009641ms,total=0.013446ms,count=2] java.util.Iterator:hasNext() #1183 | | +---[min=0.003181ms,max=0.009751ms,total=0.012932ms,count=2] java.util.Iterator:next() #1183 | | +---[min=0.005841ms,max=0.015308ms,total=0.021149ms,count=2] org.apache.commons.logging.Log:isTraceEnabled() #1184 | | `---[min=0.ms,max=1.19145ms,total=1.ms,count=2] org.springframework.web.servlet.HandlerMapping:getHandler() #1188 | +---[0.013071ms] org.springframework.web.servlet.HandlerExecutionChain:getHandler() #971 | +---[0.ms] org.springframework.web.servlet.DispatcherServlet:getHandlerAdapter() #971 | | `---[0.ms] org.springframework.web.servlet.DispatcherServlet:getHandlerAdapter() | | +---[0.004804ms] java.util.List:iterator() #1224 | | +---[0.003668ms] java.util.Iterator:hasNext() #1224 | | +---[0.003038ms] java.util.Iterator:next() #1224 | | +---[0.006451ms] org.apache.commons.logging.Log:isTraceEnabled() #1225 | | `---[0.012683ms] org.springframework.web.servlet.HandlerAdapter:supports() #1228 | +---[0.012848ms] javax.servlet.http.HttpServletRequest:getMethod() #974 | +---[0.013132ms] java.lang.String:equals() #975 | +---[0.003025ms] org.springframework.web.servlet.HandlerExecutionChain:getHandler() #977 | +---[0.008095ms] org.springframework.web.servlet.HandlerAdapter:getLastModified() #977 | +---[0.006596ms] org.apache.commons.logging.Log:isDebugEnabled() #978 | +---[0.018024ms] org.springframework.web.context.request.ServletWebRequest:<init>() #981 | +---[0.017869ms] org.springframework.web.context.request.ServletWebRequest:checkNotModified() #981 | +---[0.038542ms] org.springframework.web.servlet.HandlerExecutionChain:applyPreHandle() #986 | +---[0.00431ms] org.springframework.web.servlet.HandlerExecutionChain:getHandler() #991 | +---[4.ms] org.springframework.web.servlet.HandlerAdapter:handle() #991 | +---[0.014805ms] org.springframework.web.context.request.async.WebAsyncManager:isConcurrentHandlingStarted() #993 | +---[1.ms] org.springframework.web.servlet.DispatcherServlet:applyDefaultViewName() #997 | | `---[0.067631ms] org.springframework.web.servlet.DispatcherServlet:applyDefaultViewName() | +---[0.012027ms] org.springframework.web.servlet.HandlerExecutionChain:applyPostHandle() #998 | +---[0.ms] org.springframework.web.servlet.DispatcherServlet:processDispatchResult() #1008 | | `---[0.ms] org.springframework.web.servlet.DispatcherServlet:processDispatchResult() | | +---[0.007074ms] org.apache.commons.logging.Log:isDebugEnabled() #1075 | | +---[0.005467ms] org.springframework.web.context.request.async.WebAsyncUtils:getAsyncManager() #1081 | | +---[0.004054ms] org.springframework.web.context.request.async.WebAsyncManager:isConcurrentHandlingStarted() #1081 | | `---[0.011988ms] org.springframework.web.servlet.HandlerExecutionChain:triggerAfterCompletion() #1087 | `---[0.004015ms] org.springframework.web.context.request.async.WebAsyncManager:isConcurrentHandlingStarted() #1018 +---[0.005055ms] org.springframework.web.context.request.async.WebAsyncUtils:getAsyncManager() #928 `---[0.003422ms] org.springframework.web.context.request.async.WebAsyncManager:isConcurrentHandlingStarted() #928 <\/code><\/pre>\n
[jboss@VM_10_91_centos tmp]$ curl -w \"@curl-time.txt\" http:\/\/127.0.0.1:7744\/send success http: 200 dns: 0.001s redirect: 0.000s time_connect: 0.001s time_appconnect: 0.000s time_pretransfer: 0.001s time_starttransfer: 0.115s size_download: 7bytes speed_download: 60.000B\/s ---------- time_total: 0.115s <\/code><\/pre>\n

\u672c\u6b21\u8c03\u7528\uff0c\u8c03\u7528\u7aef\u65f6\u95f4\u82b1\u8d39115ms\uff0c\u4f46\u662f\u4ecearthas trace\u4e0a\u770b\uff0cspring mvc\u53ea\u6d88\u8017\u4e8618ms\uff0c\u90a3\u4e48\u5269\u4e0b\u768497ms\u53bb\u54ea\u4e86\u5462\uff1f<\/p>\n

\u672c\u5730\u6d4b\u8bd5\u540e\u5df2\u7ecf\u53ef\u4ee5\u6392\u9664spring mvc\u7684\u95ee\u9898\u4e86\uff0c\u6700\u540e\u4e5f\u662f\u552f\u4e00\u53ef\u80fd\u51fa\u95ee\u9898\u7684\u70b9\u5c31\u662ftomcat<\/p>\n

\u53ef\u662f\u672c\u4eba\u5e76\u4e0d\u719f\u6089tomcat\u4e2d\u7684\u6e90\u7801\uff0c\u5c31\u8fde\u8bf7\u6c42\u5165\u53e3\u90fd\u4e0d\u6e05\u695a\uff0ctomcat\u91cc\u9700\u8981trace\u7684\u7c7b\u90fd\u4e0d\u597d\u627e\u3002\u3002\u3002<\/p>\n

\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u6709\u795e\u5668Arthas\uff0c\u53ef\u4ee5\u901a\u8fc7stack\u547d\u4ee4\u6765\u53cd\u5411\u67e5\u627e\u8c03\u7528\u8def\u5f84\uff0c\u4ee5 org.springframework.web.servlet.DispatcherServlet<\/code>\u4f5c\u4e3a\u53c2\u6570\uff1a<\/p>\n

\n

stack \u8f93\u51fa\u5f53\u524d\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8c03\u7528\u8def\u5f84<\/p>\n

\u5f88\u591a\u65f6\u5019\u6211\u4eec\u90fd\u77e5\u9053\u4e00\u4e2a\u65b9\u6cd5\u88ab\u6267\u884c\uff0c\u4f46\u8fd9\u4e2a\u65b9\u6cd5\u88ab\u6267\u884c\u7684\u8def\u5f84\u975e\u5e38\u591a\uff0c\u6216\u8005\u4f60\u6839\u672c\u5c31\u4e0d\u77e5\u9053\u8fd9\u4e2a\u65b9\u6cd5\u662f\u4ece\u90a3\u91cc\u88ab\u6267\u884c\u4e86\uff0c\u6b64\u65f6\u4f60\u9700\u8981\u7684\u662f stack \u547d\u4ee4\u3002<\/p>\n<\/blockquote>\n

[arthas@24851]$ stack org.springframework.web.servlet.DispatcherServlet* Press Q orCtrl+C to abort. Affect(class-cnt:1, method-cnt:44) cost in495 ms. ts=2019-09-1421:15:19;thread_name=http-nio-7744-exec-5;id=14;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@7c @org.springframework.web.servlet.FrameworkServlet.processRequest() at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:866) at javax.servlet.http.HttpServlet.service(HttpServlet.java:635) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851) at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1468) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) ts=2019-09-1421:15:19;thread_name=http-nio-7744-exec-5;id=14;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@7c @org.springframework.web.servlet.DispatcherServlet.doService() at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:866) at javax.servlet.http.HttpServlet.service(HttpServlet.java:635) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851) at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1468) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) <\/code><\/pre>\n

\u4ecestack\u65e5\u5fd7\u4e0a\u53ef\u4ee5\u5f88\u76f4\u89c2\u7684\u770b\u51faDispatchServlet\u7684\u8c03\u7528\u6808\uff0c\u90a3\u4e48\u8fd9\u4e48\u957f\u7684\u8def\u5f84\uff0c\u8be5trace\u54ea\u4e2a\u7c7b\u5462\uff08\u8fd9\u91cc\u8df3\u8fc7spring mvc\u4e2d\u7684\u8fc7\u6ee4\u5668\u7684trace\u8fc7\u7a0b\uff0c\u5b9e\u9645\u6392\u67e5\u7684\u65f6\u5019\u4e5ftrace\u4e86\u4e00\u904d\uff0c\u4f46\u8fd9\u8be1\u5f02\u7684\u65f6\u95f4\u6d88\u8017\u4e0d\u662f\u7531\u8fd9\u91cc\u8fc7\u6ee4\u5668\u4ea7\u751f\u7684\uff09\uff1f\u6709\u4e00\u5b9a\u7ecf\u9a8c\u7684\u8001\u53f8\u673a\u4ece\u540d\u5b57\u4e0a\u5927\u6982\u4e5f\u80fd\u731c\u51fa\u6765\u4ece\u54ea\u91cc\u4e0b\u624b\u6bd4\u8f83\u597d\uff0c\u90a3\u5c31\u662f org.apache.coyote.http11.Http11Processor.service<\/code>\uff0c\u4ece\u540d\u5b57\u4e0a\u770b\uff0chttp1.1\u5904\u7406\u5668\uff0c\u8fd9\u53ef\u80fd\u662f\u4e00\u4e2a\u6bd4\u8f83\u597d\u7684\u5207\u5165\u70b9\u3002\u4e0b\u9762\u6765trace\u4e00\u4e0b\uff1a<\/p>\n

[arthas@24851]$ trace org.apache.coyote.http11.Http11Processor service Press Q orCtrl+C to abort. Affect(class-cnt:1, method-cnt:1) cost in269 ms. `---ts=2019-09-14 21:22:51;thread_name=http-nio-7744-exec-8;id=17;is_daemon=true;priority=5;TCCL=org.springframework.boot.loader.LaunchedURLClassLoader@20ad9418 `---[131.ms] org.apache.coyote.http11.Http11Processor:service() +---[0.036851ms] org.apache.coyote.Request:getRequestProcessor() #667 +---[0.009986ms] org.apache.coyote.RequestInfo:setStage() #668 +---[0.008928ms] org.apache.coyote.http11.Http11Processor:setSocketWrapper() #671 +---[0.013236ms] org.apache.coyote.http11.Http11InputBuffer:init() #672 +---[0.00981ms] org.apache.coyote.http11.Http11OutputBuffer:init() #673 +---[min=0.00213ms,max=0.007317ms,total=0.009447ms,count=2] org.apache.coyote.http11.Http11Processor:getErrorState() #683 +---[min=0.002098ms,max=0.008888ms,total=0.010986ms,count=2] org.apache.coyote.ErrorState:isError() #683 +---[min=0.002448ms,max=0.007149ms,total=0.009597ms,count=2] org.apache.coyote.http11.Http11Processor:isAsync() #683 +---[min=0.002399ms,max=0.00852ms,total=0.010919ms,count=2] org.apache.tomcat.util.net.AbstractEndpoint:isPaused() #683 +---[min=0.033587ms,max=0.11832ms,total=0.ms,count=2] org.apache.coyote.http11.Http11InputBuffer:parseRequestLine() #687 +---[0.005384ms] org.apache.tomcat.util.net.AbstractEndpoint:isPaused() #695 +---[0.007924ms] org.apache.coyote.Request:getMimeHeaders() #702 +---[0.006744ms] org.apache.tomcat.util.net.AbstractEndpoint:getMaxHeaderCount() #702 +---[0.012574ms] org.apache.tomcat.util.http.MimeHeaders:setLimit() #702 +---[0.14319ms] org.apache.coyote.http11.Http11InputBuffer:parseHeaders() #703 +---[0.003997ms] org.apache.coyote.Request:getMimeHeaders() #743 +---[0.026561ms] org.apache.tomcat.util.http.MimeHeaders:values() #743 +---[min=0.002869ms,max=0.01203ms,total=0.014899ms,count=2] java.util.Enumeration:hasMoreElements() #745 +---[0.070114ms] java.util.Enumeration:nextElement() #746 +---[0.010921ms] java.lang.String:toLowerCase() #746 +---[0.008453ms] java.lang.String:contains() #746 +---[0.002698ms] org.apache.coyote.http11.Http11Processor:getErrorState() #775 +---[0.00307ms] org.apache.coyote.ErrorState:isError() #775 +---[0.002708ms] org.apache.coyote.RequestInfo:setStage() #777 +---[0.ms] org.apache.coyote.http11.Http11Processor:prepareRequest() #779 +---[0.009349ms] org.apache.tomcat.util.net.SocketWrapperBase:decrementKeepAlive() #794 +---[0.002574ms] org.apache.coyote.http11.Http11Processor:getErrorState() #800 +---[0.002696ms] org.apache.coyote.ErrorState:isError() #800 +---[0.002499ms] org.apache.coyote.RequestInfo:setStage() #802 +---[0.005641ms] org.apache.coyote.http11.Http11Processor:getAdapter() #803 +---[129.ms] org.apache.coyote.Adapter:service() #803 +---[0.003859ms] org.apache.coyote.http11.Http11Processor:getErrorState() #809 +---[0.002365ms] org.apache.coyote.ErrorState:isError() #809 +---[0.003844ms] org.apache.coyote.http11.Http11Processor:isAsync() #809 +---[0.002382ms] org.apache.coyote.Response:getStatus() #809 +---[0.002476ms] org.apache.coyote.http11.Http11Processor:statusDropsConnection() #809 +---[0.002284ms] org.apache.coyote.RequestInfo:setStage() #838 +---[0.00222ms] org.apache.coyote.http11.Http11Processor:isAsync() #839 +---[0.037873ms] org.apache.coyote.http11.Http11Processor:endRequest() #843 +---[0.002188ms] org.apache.coyote.RequestInfo:setStage() #845 +---[0.002112ms] org.apache.coyote.http11.Http11Processor:getErrorState() #849 +---[0.002063ms] org.apache.coyote.ErrorState:isError() #849 +---[0.002504ms] org.apache.coyote.http11.Http11Processor:isAsync() #853 +---[0.009808ms] org.apache.coyote.Request:updateCounters() #854 +---[0.002008ms] org.apache.coyote.http11.Http11Processor:getErrorState() #855 +---[0.002192ms] org.apache.coyote.ErrorState:isIoAllowed() #855 +---[0.01968ms] org.apache.coyote.http11.Http11InputBuffer:nextRequest() #856 +---[0.010065ms] org.apache.coyote.http11.Http11OutputBuffer:nextRequest() #857 +---[0.002576ms] org.apache.coyote.RequestInfo:setStage() #870 +---[0.016599ms] org.apache.coyote.http11.Http11Processor:processSendfile() #872 +---[0.008182ms] org.apache.coyote.http11.Http11InputBuffer:getParsingRequestLinePhase() #688 +---[0.0075ms] org.apache.coyote.http11.Http11Processor:handleIncompleteRequestLineRead() #690 +---[0.001979ms] org.apache.coyote.RequestInfo:setStage() #875 +---[0.001981ms] org.apache.coyote.http11.Http11Processor:getErrorState() #877 +---[0.001934ms] org.apache.coyote.ErrorState:isError() #877 +---[0.001995ms] org.apache.tomcat.util.net.AbstractEndpoint:isPaused() #877 +---[0.002403ms] org.apache.coyote.http11.Http11Processor:isAsync() #879 `---[0.006176ms] org.apache.coyote.http11.Http11Processor:isUpgrade() #881 <\/code><\/pre>\n

\u65e5\u5fd7\u91cc\u6709\u4e00\u4e2a129ms\u7684\u8017\u65f6\u70b9\uff08\u65f6\u95f4\u6bd4\u6ca1\u5f00arthas\u7684\u65f6\u5019\u66f4\u957f\u662f\u56e0\u4e3aarthas\u672c\u8eab\u5e26\u6765\u7684\u6027\u80fd\u6d88\u8017\uff0c\u6240\u4ee5\u751f\u4ea7\u73af\u5883\u5c0f\u5fc3\u4f7f\u7528\uff09\uff0c\u8fd9\u4e2a\u5c31\u662f\u8981\u627e\u7684\u95ee\u9898\u70b9\u3002\u6574\u7f16\uff1a\u5fae\u4fe1\u516c\u4f17\u53f7\uff0c\u4e1a\u4f59\u8349<\/p>\n

\u6253\u95ee\u9898\u70b9\u627e\u5230\u4e86\uff0c\u90a3\u600e\u4e48\u5b9a\u4f4d\u662f\u4ec0\u4e48\u5bfc\u81f4\u7684\u95ee\u9898\u5462\uff0c\u53c8\u5982\u4f55\u89e3\u51b3\u5462\uff1f<\/p>\n

\u7ee7\u7eedtrace\u5427\uff0c\u7ec6\u5316\u5230\u5177\u4f53\u7684\u4ee3\u7801\u5757\u6216\u8005\u5185\u5bb9\u3002trace\u7531\u4e8e\u6027\u80fd\u8003\u8651\uff0c\u4e0d\u4f1a\u5c55\u793a\u6240\u6709\u7684\u8c03\u7528\u8def\u5f84\uff0c\u5982\u679c\u8c03\u7528\u8def\u5f84\u8fc7\u6df1\uff0c\u53ea\u6709\u624b\u52a8\u6df1\u5165trace\uff0c\u539f\u5219\u5c31\u662ftrace\u8017\u65f6\u957f\u7684\u90a3\u4e2a\u65b9\u6cd5\uff1a<\/p>\n

[arthas@24851]$ trace org.apache.coyote.Adapter service Press Q orCtrl+C to abort. Affect(class-cnt:1, method-cnt:1) cost in608 ms. `---ts=2019-09-14 21:34:33;thread_name=http-nio-7744-exec-1;id=10;is_daemon=true;priority=5;TCCL=org.springframework.boot.loader.LaunchedURLClassLoader@20ad9418 `---[81.70999ms] org.apache.catalina.connector.CoyoteAdapter:service() +---[0.032546ms] org.apache.coyote.Request:getNote() #302 +---[0.007148ms] org.apache.coyote.Response:getNote() #303 +---[0.007475ms] org.apache.catalina.connector.Connector:getXpoweredBy() #324 +---[0.00447ms] org.apache.coyote.Request:getRequestProcessor() #331 +---[0.007902ms] java.lang.ThreadLocal:get() #331 +---[0.006522ms] org.apache.coyote.RequestInfo:setWorkerThreadName() #331 +---[73.ms] org.apache.catalina.connector.CoyoteAdapter:postParseRequest() #336 +---[0.001536ms] org.apache.catalina.connector.Connector:getService() #339 +---[0.004469ms] org.apache.catalina.Service:getContainer() #339 +---[0.007074ms] org.apache.catalina.Engine:getPipeline() #339 +---[0.004334ms] org.apache.catalina.Pipeline:isAsyncSupported() #339 +---[0.002466ms] org.apache.catalina.connector.Request:setAsyncSupported() #339 +---[6.01E-4ms] org.apache.catalina.connector.Connector:getService() #342 +---[0.001859ms] org.apache.catalina.Service:getContainer() #342 +---[9.65E-4ms] org.apache.catalina.Engine:getPipeline() #342 +---[0.005231ms] org.apache.catalina.Pipeline:getFirst() #342 +---[7.ms] org.apache.catalina.Valve:invoke() #342 +---[0.006904ms] org.apache.catalina.connector.Request:isAsync() #345 +---[0.00509ms] org.apache.catalina.connector.Request:finishRequest() #372 +---[0.051461ms] org.apache.catalina.connector.Response:finishResponse() #373 +---[0.007244ms] java.util.concurrent.atomic.AtomicBoolean:<init>() #379 +---[0.007314ms] org.apache.coyote.Response:action() #380 +---[0.004518ms] org.apache.catalina.connector.Request:isAsyncCompleting() #382 +---[0.001072ms] org.apache.catalina.connector.Request:getContext() #394 +---[0.007166ms] java.lang.System:currentTimeMillis() #401 +---[0.004367ms] org.apache.coyote.Request:getStartTime() #401 +---[0.011483ms] org.apache.catalina.Context:logAccess() #401 +---[0.0014ms] org.apache.coyote.Request:getRequestProcessor() #406 +---[min=8.0E-4ms,max=9.22E-4ms,total=0.001722ms,count=2] java.lang.Integer:<init>() #406 +---[0.001082ms] java.lang.reflect.Method:invoke() #406 +---[0.001851ms] org.apache.coyote.RequestInfo:setWorkerThreadName() #406 +---[0.035805ms] org.apache.catalina.connector.Request:recycle() #410 `---[0.007849ms] org.apache.catalina.connector.Response:recycle() #411 <\/code><\/pre>\n
\n

\u4e00\u6bb5\u65e0\u804a\u7684\u624b\u52a8\u6df1\u5165trace\u4e4b\u540e\u2026\u2026\u2026\u2026\u2026\u2026<\/p>\n

[arthas@24851]$ trace org.apache.catalina.webresources.AbstractArchiveResourceSet getArchiveEntries Press Q orCtrl+C to abort. Affect(class-cnt:4, method-cnt:2) cost in150 ms. `---ts=2019-09-14 21:36:26;thread_name=http-nio-7744-exec-3;id=12;is_daemon=true;priority=5;TCCL=org.springframework.boot.loader.LaunchedURLClassLoader@20ad9418 `---[75.ms] org.apache.catalina.webresources.JarWarResourceSet:getArchiveEntries() +---[0.025731ms] java.util.HashMap:<init>() #106 +---[0.097729ms] org.apache.catalina.webresources.JarWarResourceSet:openJarFile() #109 +---[0.091037ms] java.util.jar.JarFile:getJarEntry() #110 +---[0.096325ms] java.util.jar.JarFile:getInputStream() #111 +---[0.ms] org.apache.catalina.webresources.TomcatJarInputStream:<init>() #113 +---[min=0.001175ms,max=0.001176ms,total=0.002351ms,count=2] java.lang.Integer:<init>() #114 +---[0.00104ms] java.lang.reflect.Method:invoke() #114 +---[0.045105ms] org.apache.catalina.webresources.TomcatJarInputStream:getNextJarEntry() #114 +---[min=5.02E-4ms,max=0.008531ms,total=0.028864ms,count=31] java.util.jar.JarEntry:getName() #116 +---[min=5.39E-4ms,max=0.022805ms,total=0.054647ms,count=31] java.util.HashMap:put() #116 +---[min=0.004452ms,max=34.ms,total=74.ms,count=31] org.apache.catalina.webresources.TomcatJarInputStream:getNextJarEntry() #117 +---[0.018358ms] org.apache.catalina.webresources.TomcatJarInputStream:getManifest() #119 +---[0.006429ms] org.apache.catalina.webresources.JarWarResourceSet:setManifest() #120 +---[0.010904ms] org.apache.tomcat.util.compat.JreCompat:isJre9Available() #121 +---[0.003307ms] org.apache.catalina.webresources.TomcatJarInputStream:getMetaInfEntry() #133 +---[5.5E-4ms] java.util.jar.JarEntry:getName() #135 +---[6.42E-4ms] java.util.HashMap:put() #135 +---[0.001981ms] org.apache.catalina.webresources.TomcatJarInputStream:getManifestEntry() #137 +---[0.064484ms] org.apache.catalina.webresources.TomcatJarInputStream:close() #141 +---[0.007961ms] org.apache.catalina.webresources.JarWarResourceSet:closeJarFile() #151 `---[0.004643ms] java.io.InputStream:close() #155 <\/code><\/pre>\n

\u53d1\u73b0\u4e86\u4e00\u4e2a\u503c\u5f97\u6682\u505c\u601d\u8003\u7684\u70b9\uff1a<\/p>\n

+---[min=0.004452ms,max=34.ms,total=74.ms,count=31]org.apache.catalina.webresources.TomcatJarInputStream:getNextJarEntry() #117 <\/code><\/pre>\n

\u8fd9\u884c\u4ee3\u7801\u52a0\u8f7d\u4e8631\u6b21\uff0c\u4e00\u5171\u8017\u65f674ms\uff1b\u4ece\u540d\u5b57\u4e0a\u770b\uff0c\u5e94\u8be5\u662ftomcat\u52a0\u8f7djar\u5305\u65f6\u7684\u8017\u65f6\uff0c\u90a3\u4e48\u662f\u52a0\u8f7d\u4e8631\u4e2ajar\u5305\u7684\u8017\u65f6\uff0c\u8fd8\u662f\u52a0\u8f7d\u4e86jar\u5305\u5185\u7684\u67d0\u4e9b\u8d44\u6e9031\u6b21\u8017\u65f6\u5462\uff1f<\/p>\n

TomcatJarInputStream<\/code>\u8fd9\u4e2a\u7c7b\u6e90\u7801\u7684\u6ce8\u91ca\u5199\u5230\uff1a<\/p>\n

\n

The purpose of this sub-class is to obtain references to the JarEntry objects for META-INF\/ and META-INF\/MANIFEST.MF that are otherwise swallowed by the JarInputStream implementation.<\/p>\n<\/blockquote>\n

\u5927\u6982\u610f\u601d\u4e5f\u5c31\u662f\uff0c\u83b7\u53d6jar\u5305\u5185META-INF\/\uff0cMETA-INF\/MANIFEST\u7684\u8d44\u6e90\uff0c\u8fd9\u662f\u4e00\u4e2a\u5b50\u7c7b\uff0c\u66f4\u591a\u7684\u529f\u80fd\u5728\u7236\u7c7bJarInputStream\u91cc\u3002<\/p>\n

\u5176\u5b9e\u770b\u5230\u8fd9\u91cc\u5927\u6982\u4e5f\u80fd\u731c\u5230\u95ee\u9898\u4e86\uff0ctomcat\u52a0\u8f7djar\u5305\u5185META-INF\/\uff0cMETA-INF\/MANIFEST\u7684\u8d44\u6e90\u5bfc\u81f4\u7684\u8017\u65f6\uff0c\u81f3\u4e8e\u4e3a\u4ec0\u4e48\u8fde\u7eed\u8bf7\u6c42\u4e0d\u4f1a\u8017\u65f6\uff0c\u5e94\u8be5\u662ftomcat\u7684\u7f13\u5b58\u673a\u5236\uff08\u4e0b\u9762\u4ecb\u7ecd\u6e90\u7801\u5206\u6790\uff09<\/p>\n

\u4e0d\u7740\u6025\u5b9a\u4f4d\u95ee\u9898\uff0c\u8bd5\u7740\u901a\u8fc7Arthas\u6700\u7ec8\u5b9a\u4f4d\u95ee\u9898\u7ec6\u8282\uff0c\u7ee7\u7eed\u624b\u52a8\u6df1\u5165trace<\/p>\n

[arthas@24851]$ trace org.apache.catalina.webresources.TomcatJarInputStream* Press Q orCtrl+C to abort. Affect(class-cnt:1, method-cnt:4) cost in44 ms. `---ts=2019-09-14 21:37:47;thread_name=http-nio-7744-exec-5;id=14;is_daemon=true;priority=5;TCCL=org.springframework.boot.loader.LaunchedURLClassLoader@20ad9418 `---[0.ms] org.apache.catalina.webresources.TomcatJarInputStream:createZipEntry() +---[0.039455ms] java.util.jar.JarInputStream:createZipEntry() #43 `---[0.007827ms] java.lang.String:equals() #44 `---ts=2019-09-1421:37:47;thread_name=http-nio-7744-exec-5;id=14;is_daemon=true;priority=5;TCCL=org.springframework.boot.loader.LaunchedURLClassLoader@20ad9418 `---[0.050222ms] org.apache.catalina.webresources.TomcatJarInputStream:createZipEntry() +---[0.001889ms] java.util.jar.JarInputStream:createZipEntry() #43 `---[0.001643ms] java.lang.String:equals() #46 #\u8fd9\u91cc\u4e00\u517131\u4e2atrace\u65e5\u5fd7\uff0c\u5220\u51cf\u4e86\u5269\u4e0b\u7684 <\/code><\/pre>\n

\u4ece\u65b9\u6cd5\u540d\u4e0a\u770b\uff0c\u8fd8\u662f\u52a0\u8f7d\u8d44\u6e90\u4e4b\u7c7b\u7684\u610f\u601d\u3002\u90fd\u5df2\u7ecf\u5230jdk\u6e90\u7801\u4e86\uff0c\u8fd9\u65f6\u5019\u6765\u770b\u4e00\u4e0b TomcatJarInputStream<\/code>\u8fd9\u4e2a\u7c7b\u7684\u6e90\u7801:<\/p>\n

\/** * Creates a new <code>JarEntry<\/code> (<code>ZipEntry<\/code>) for the * specified JAR file entry name. The manifest attributes of * the specified JAR file entry name will be copied to the new * <CODE>JarEntry<\/CODE>. * * @param name the name of the JAR\/ZIP file entry * @return the <code>JarEntry<\/code> object just created *\/ protectedZipEntry createZipEntry(String name) { JarEntry e = newJarEntry(name); if(man != null) { e.attr = man.getAttributes(name); } return e; } <\/code><\/pre>\n

\u8fd9\u4e2a createZipEntry<\/code>\u6709\u4e2aname\u53c2\u6570\uff0c\u4ece\u6ce8\u91ca\u4e0a\u770b\uff0c\u662fjar\/zip\u6587\u4ef6\u540d\uff0c\u5982\u679c\u80fd\u5f97\u5230\u6587\u4ef6\u540d\u8fd9\u79cd\u5173\u952e\u4fe1\u606f\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u5b9a\u4f4d\u95ee\u9898\u4e86\uff1b\u8fd8\u662f\u901a\u8fc7Arthas\uff0c\u4f7f\u7528watch\u547d\u4ee4\uff0c\u52a8\u6001\u76d1\u6d4b\u65b9\u6cd5\u8c03\u7528\u6570\u636e<\/p>\n

\n

watch\u65b9\u6cd5\u6267\u884c\u6570\u636e\u89c2\u6d4b<\/p>\n

\u8ba9\u4f60\u80fd\u65b9\u4fbf\u7684\u89c2\u5bdf\u5230\u6307\u5b9a\u65b9\u6cd5\u7684\u8c03\u7528\u60c5\u51b5\u3002\u80fd\u89c2\u5bdf\u5230\u7684\u8303\u56f4\u4e3a\uff1a\u8fd4\u56de\u503c\u3001\u629b\u51fa\u5f02\u5e38\u3001\u5165\u53c2\uff0c\u901a\u8fc7\u7f16\u5199 OGNL \u8868\u8fbe\u5f0f\u8fdb\u884c\u5bf9\u5e94\u53d8\u91cf\u7684\u67e5\u770b\u3002<\/p>\n<\/blockquote>\n

watch \u8be5\u65b9\u6cd5\u7684\u5165\u53c2<\/p>\n

[arthas@24851]$ watch  org.apache.catalina.webresources.TomcatJarInputStream createZipEntry \"{params[0]}\"\nPress Q orCtrl+C to abort.\nAffect(class-cnt:1, method-cnt:1) cost in27 ms.\nts=2019-09-1421:51:14; [cost=0.14547ms] result=@ArrayList[\n@String[META-INF\/],\n]\nts=2019-09-1421:51:14; [cost=0.048028ms] result=@ArrayList[\n@String[META-INF\/MANIFEST.MF],\n]\nts=2019-09-1421:51:14; [cost=0.046071ms] result=@ArrayList[\n@String[META-INF\/resources\/],\n]\nts=2019-09-1421:51:14; [cost=0.033855ms] result=@ArrayList[\n@String[META-INF\/resources\/swagger-ui.html],\n]\nts=2019-09-1421:51:14; [cost=0.039138ms] result=@ArrayList[\n@String[META-INF\/resources\/webjars\/],\n]\nts=2019-09-1421:51:14; [cost=0.033701ms] result=@ArrayList[\n@String[META-INF\/resources\/webjars\/springfox-swagger-ui\/],\n]\nts=2019-09-1421:51:14; [cost=0.033644ms] result=@ArrayList[\n@String[META-INF\/resources\/webjars\/springfox-swagger-ui\/favicon-16x16.png],\n]\nts=2019-09-1421:51:14; [cost=0.033976ms] result=@ArrayList[\n@String[META-INF\/resources\/webjars\/springfox-swagger-ui\/springfox.css],\n]\nts=2019-09-1421:51:14; [cost=0.032818ms] result=@ArrayList[\n@String[META-INF\/resources\/webjars\/springfox-swagger-ui\/swagger-ui-standalone-preset.js.map],\n]\nts=2019-09-1421:51:14; [cost=0.04651ms] result=@ArrayList[\n@String[META-INF\/resources\/webjars\/springfox-swagger-ui\/swagger-ui.css],\n]\nts=2019-09-1421:51:14; [cost=0.034793ms] result=@ArrayList[\n@String[META-INF\/resources\/webjars\/springfox-swagger-ui\/swagger-ui.js.map],\n<\/code><\/pre>\n

\u8fd9\u4e0b\u76f4\u63a5\u770b\u5230\u4e86\u5177\u4f53\u52a0\u8f7d\u7684\u8d44\u6e90\u540d\uff0c\u8fd9\u4e48\u719f\u6089\u7684\u540d\u5b57\uff1aswagger-ui\uff0c\u4e00\u4e2a\u56fd\u5916\u7684rest\u63a5\u53e3\u6587\u6863\u5de5\u5177\uff0c\u53c8\u6709\u56fd\u5185\u5f00\u53d1\u8005\u57fa\u4e8eswagger-ui\u505a\u4e86\u4e00\u5957spring mvc\u7684\u96c6\u6210\u5de5\u5177\uff0c\u901a\u8fc7\u6ce8\u89e3\u5c31\u53ef\u4ee5\u81ea\u52a8\u751f\u6210swagger-ui\u9700\u8981\u7684\u63a5\u53e3\u5b9a\u4e49json\u6587\u4ef6\uff0c\u7528\u8d77\u6765\u8fd8\u6bd4\u8f83\u65b9\u4fbf\uff0c\u5c31\u662f\u4fb5\u5165\u6027\u8f83\u5f3a\u3002<\/p>\n


\n

\u5220\u9664swagger\u7684jar\u5305\u540e\u95ee\u9898\uff0c\u8be1\u5f02\u768470+ms\u5c31\u6d88\u5931\u4e86<\/p>\n

<!--pom \u91cc\u5220\u9664\u8fd9\u4e24\u4e2a\u5f15\u7528\uff0c\u8fd9\u4e24\u4e2a\u5305\u65f6\u56fd\u5185\u5f00\u53d1\u8005\u5c01\u88c5\u7684\uff0cswagger-ui\u5e76\u6ca1\u6709\u63d0\u4f9bjava spring-mvc\u7684\u652f\u6301\u5305\uff0cswagger\u53ea\u662f\u4e00\u4e2a\u6d4f\u89c8\u5668\u7aef\u7684ui+editor <dependency> <groupId>io.springfox<\/groupId> <artifactId>springfox-swagger2<\/artifactId> <version>2.9.2<\/version> <\/dependency> <dependency> <groupId>io.springfox<\/groupId> <artifactId>springfox-swagger-ui<\/artifactId> <version>2.9.2<\/version> <\/dependency> <\/code><\/pre>\n

\u90a3\u4e48\u4e3a\u4ec0\u4e48swagger\u4f1a\u5bfc\u81f4\u8bf7\u6c42\u8017\u65f6\u5462\uff0c\u4e3a\u4ec0\u4e48\u6bcf\u6b21\u8bf7\u6c42\u5076\u8bfb\u4f1a\u52a0\u8f7dswagger\u5185\u90e8\u7684\u9759\u6001\u8d44\u6e90\u5462\uff1f<\/p>\n

\u5176\u5b9e\u8fd9\u662ftomcat-embed\u7684\u4e00\u4e2abug\u5427\uff0c\u4e0b\u9762\u8be6\u7ec6\u4ecb\u7ecd\u4e00\u4e0b\u8be5Bug<\/p>\n

Tomcat embed Bug\u5206\u6790&\u89e3\u51b3<\/strong><\/h3>\n

\u6e90\u7801\u5206\u6790\u8fc7\u7a0b\u5b9e\u5728\u592a\u6f2b\u957f\uff0c\u800c\u4e14\u4e5f\u4e0d\u662f\u672c\u6587\u7684\u91cd\u70b9\uff0c\u6240\u4ee5\u5c31\u4e0d\u4ecb\u7ecd\u4e86\uff0c \u4e0b\u9762\u76f4\u63a5\u4ecb\u7ecd\u4e0b\u5206\u6790\u7ed3\u679c<\/p>\n

\u987a\u4fbf\u8d34\u4e00\u5f20tomcat\u5904\u7406\u8bf7\u6c42\u7684\u6838\u5fc3\u7c7b\u56fe<\/p>\n

\"\u963f\u91cc\u8bca\u65ad\u5de5\u5177arthas_\u963f\u91cc\u8fd0\u8425<\/p>\n

\u4e3a\u4ec0\u4e48\u6bcf\u6b21\u8bf7\u6c42\u4f1a\u52a0\u8f7dJar\u5305\u5185\u7684\u9759\u6001\u8d44\u6e90<\/strong><\/h4>\n

\u5173\u952e\u5728\u4e8e org.apache.catalina.mapper.Mapper#internalMapWrapper<\/code>\u8fd9\u4e2a\u65b9\u6cd5\uff0c\u8be5\u7248\u672c\u4e0b\u5904\u7406\u8bf7\u6c42\u7684\u65b9\u5f0f\u6709\u95ee\u9898\uff0c\u5bfc\u81f4\u6bcf\u6b21\u90fd\u6821\u9a8c\u9759\u6001\u8d44\u6e90\u3002<\/p>\n

\u4e3a\u4ec0\u4e48\u8fde\u7eed\u8bf7\u6c42\u4e0d\u4f1a\u51fa\u73b0\u95ee\u9898<\/strong><\/h4>\n

\u56e0\u4e3aTomcat\u5bf9\u4e8e\u8fd9\u79cd\u9759\u6001\u8d44\u6e90\u7684\u89e3\u6790\u662f\u6709\u7f13\u5b58\u7684\uff0c\u4f18\u5148\u4ece\u7f13\u5b58\u67e5\u627e\uff0c\u7f13\u5b58\u8fc7\u671f\u540e\u518d\u91cd\u65b0\u89e3\u6790\u3002\u5177\u4f53\u53c2\u8003 org.apache.catalina.webresources.Cache<\/code>\uff0c\u9ed8\u8ba4\u8fc7\u671f\u65f6\u95f4ttl\u662f5000ms\u3002<\/p>\n

\u4e3a\u4ec0\u4e48\u672c\u5730\u4e0d\u4f1a\u590d\u73b0<\/strong><\/h4>\n

\u5176\u5b9e\u786e\u5207\u7684\u8bf4\uff0c\u662f\u901a\u8fc7spring-boot\u6253\u5305\u63d2\u4ef6\u540e\u4e0d\u80fd\u590d\u73b0\u3002\u7531\u4e8e\u542f\u52a8\u65b9\u5f0f\u7684\u4e0d\u540c\uff0ctomcat\u4f7f\u7528\u4e86\u4e0d\u540c\u7684\u7c7b\u53bb\u5904\u7406\u9759\u6001\u8d44\u6e90\uff0c\u6240\u4ee5\u6ca1\u95ee\u9898\u3002\u6574\u7f16\uff1a\u5fae\u4fe1\u516c\u4f17\u53f7\uff0c\u4e1a\u4f59\u8349<\/p>\n

\u5982\u4f55\u89e3\u51b3<\/strong><\/h4>\n

\u5347\u7ea7tomcat-embed\u7248\u672c\u5373\u53ef<\/p>\n

\u5f53\u524d\u51fa\u73b0Bug\u7684\u7248\u672c\u4e3a\uff1a<\/p>\n

spring-boot:2.0.2.RELEASE\uff0c\u5185\u7f6e\u7684tomcat embed\u7248\u672c\u4e3a8.5.31<\/p>\n

\u5347\u7ea7tomcat embed\u7248\u672c\u81f38.5.40+\u5373\u53ef\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u65b0\u7248\u672c\u5df2\u7ecf\u4fee\u590d\u4e86<\/p>\n

\u901a\u8fc7\u66ff\u6362springboot pom properties\u65b9\u5f0f<\/strong><\/h5>\n

\u5982\u679c\u9879\u76ee\u662fmaven\u662f\u7ee7\u627f\u7684springboot\uff0c\u5373parent\u914d\u7f6e\u4e3aspringboot\u7684\uff0c\u6216\u8005dependencyManagement\u4e2dimport spring boot\u5305\u7684<\/p>\n

<parent> <groupId>org.springframework.boot<\/groupId> <artifactId>spring-boot-starter-parent<\/artifactId> <version>2.0.2.RELEASE<\/version> <relativePath\/><!-- lookup parent from repository --> <\/parent> <\/code><\/pre>\n

pom\u4e2d\u76f4\u63a5\u8986\u76d6properties\u5373\u53ef\uff1a<\/p>\n

<properties> <tomcat.version>8.5.40<\/tomcat.version> <\/properties> <\/code><\/pre>\n

\u5347\u7ea7spring boot\u7248\u672c<\/strong><\/h4>\n

springboot 2.1.0.RELEASE\u4e2d\u7684tomcat embed\u7248\u672c\u5df2\u7ecf\u5927\u4e8e8.5.31\u4e86\uff0c\u6240\u4ee5\u76f4\u63a5\u5c06springboot\u5347\u7ea7\u81f3\u8be5\u7248\u672c\u53ca\u4ee5\u4e0a\u7248\u672c\u5c31\u53ef\u4ee5\u89e3\u51b3\u6b64\u95ee\u9898<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"\u963f\u91cc\u8bca\u65ad\u5de5\u5177arthas_\u963f\u91cc\u8fd0\u8425\u957f\u6587\u9884\u8b66\uff01\uff01\uff01Arthas\u662fAlibaba\u5f00\u6e90\u7684Java\u8bca\u65ad\u5de5\u5177","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"_links":{"self":[{"href":"https:\/\/mushiming.com\/wp-json\/wp\/v2\/posts\/5832"}],"collection":[{"href":"https:\/\/mushiming.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mushiming.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mushiming.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mushiming.com\/wp-json\/wp\/v2\/comments?post=5832"}],"version-history":[{"count":0,"href":"https:\/\/mushiming.com\/wp-json\/wp\/v2\/posts\/5832\/revisions"}],"wp:attachment":[{"href":"https:\/\/mushiming.com\/wp-json\/wp\/v2\/media?parent=5832"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mushiming.com\/wp-json\/wp\/v2\/categories?post=5832"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mushiming.com\/wp-json\/wp\/v2\/tags?post=5832"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}