{"id":1687,"date":"2023-03-25T22:41:36","date_gmt":"2023-03-25T14:41:36","guid":{"rendered":"https:\/\/www.appblog.cn\/?p=1687"},"modified":"2023-04-23T21:46:53","modified_gmt":"2023-04-23T13:46:53","slug":"arthas-alibaba-online-diagnostic-artifact","status":"publish","type":"post","link":"https:\/\/www.appblog.cn\/index.php\/2023\/03\/25\/arthas-alibaba-online-diagnostic-artifact\/","title":{"rendered":"Arthas(\u963f\u5c14\u8428\u65af) &#8212; \u963f\u91cc\u5728\u7ebf\u8bca\u65ad\u795e\u5668"},"content":{"rendered":"<h2>Arthas\u7b80\u4ecb<\/h2>\n<p>Arthas \u662fAlibaba\u5f00\u6e90\u7684Java\u8bca\u65ad\u5de5\u5177\uff0c\u6df1\u53d7\u5f00\u53d1\u8005\u559c\u7231\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<br \/>\nArthas \u652f\u6301JDK 6+\uff0c\u652f\u6301Linux\/Mac\/Windows\uff0c\u91c7\u7528\u547d\u4ee4\u884c\u4ea4\u4e92\u6a21\u5f0f\uff0c\u540c\u65f6\u63d0\u4f9b\u4e30\u5bcc\u7684 Tab \u81ea\u52a8\u8865\u5168\u529f\u80fd\uff0c\u8fdb\u4e00\u6b65\u65b9\u4fbf\u8fdb\u884c\u95ee\u9898\u7684\u5b9a\u4f4d\u548c\u8bca\u65ad\u3002<\/p>\n<p><!-- more --><\/p>\n<p>Github: <a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/github.com\/alibaba\/arthas\">https:\/\/github.com\/alibaba\/arthas<\/a><br \/>\n\u6587\u6863: <a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/arthas.aliyun.com\/doc\/\">https:\/\/arthas.aliyun.com\/doc\/<\/a><br \/>\n\u53c2\u8003\uff1a<a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/alibaba.github.io\/arthas\/quick-start.html\">https:\/\/alibaba.github.io\/arthas\/quick-start.html<\/a><br \/>\n\u6f14\u793a\uff1a<a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/arthas.aliyun.com\/doc\/arthas-tutorials.html?language=cn\">https:\/\/arthas.aliyun.com\/doc\/arthas-tutorials.html?language=cn<\/a><br \/>\n\u547d\u4ee4\u5217\u8868: <a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/arthas.aliyun.com\/doc\/commands.html\">https:\/\/arthas.aliyun.com\/doc\/commands.html<\/a><\/p>\n<h2>\u6d4b\u8bd5\u5e94\u7528<\/h2>\n<p>\u9996\u5148\uff0c\u6211\u4eec\u968f\u4fbf\u6765\u4e00\u4e2a\u6d4b\u8bd5\u9879\u76ee\uff0c\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-java\">package cn.appblog.arthas;\n\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n\/**\n * @author yezhou\n * @version 1.0\n * @date 2020\/8\/20 10:28\n *\/\n@RestController\npublic class TestController {\n\n    @GetMapping(value = &quot;test&quot;)\n    public User abc(Integer integer) {\n        if (integer == 0) {\n            throw new IllegalArgumentException(&quot;\u53c2\u6570 0 \u5f02\u5e38&quot;);\n        }\n        User user = new User();\n        user.setName(&quot;Joe.Ye&quot;);\n        user.setAge(integer);\n        return user;\n    }\n}<\/code><\/pre>\n<h2>Arthas\u670d\u52a1\u542f\u52a8\u53ca\u4f7f\u7528<\/h2>\n<p>\uff081\uff09\u542f\u52a8\u670d\u52a1<\/p>\n<pre><code class=\"language-bash\">E:\\Java-Project\\arthas&gt;java -jar arthas-boot.jar\n[INFO] arthas-boot version: 3.3.9\n[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.\n* [1]: 11908\n  [2]: 26932 cn.appblog.arthas.ArthasApplication\n2  \/\/\u9009\u62e9\u5e94\u7528\u8fdb\u7a0b\n[INFO] Start download arthas from remote server: https:\/\/arthas.aliyun.com\/download\/3.3.9?mirror=aliyun\n[INFO] File size: 11.44 MB, downloaded size: 11.20 MB, downloading ...\n[INFO] Download arthas success.\n[INFO] arthas home: C:\\Users\\yezhou\\.arthas\\lib\\3.3.9\\arthas\n[INFO] Try to attach process 11908\nException in thread &quot;main&quot; java.lang.IllegalArgumentException: Can not find tools.jar under java home: C:\\Program Files\\Java\\jre1.8.0_231, please try to start arthas-boot with full path java. Such as \/opt\/jdk\/bin\/java -jar arthas-boot.jar\n        at com.taobao.arthas.boot.ProcessUtils.findJavaHome(ProcessUtils.java:222)\n        at com.taobao.arthas.boot.ProcessUtils.startArthasCore(ProcessUtils.java:233)\n        at com.taobao.arthas.boot.Bootstrap.main(Bootstrap.java:506)<\/code><\/pre>\n<p>\uff082\uff09\u82e5\u62a5\u5982\u4e0a\u9519\u8bef\uff0c\u5219\u4ee5\u5982\u4e0b\u65b9\u5f0f\u542f\u52a8<\/p>\n<pre><code class=\"language-bash\">set JAVA_HOME=&quot;C:\\Program Files\\Java\\jdk1.8.0_231\\jre&quot;\n&quot;C:\\Program Files\\Java\\jdk1.8.0_231\\bin\\java.exe&quot; -jar arthas-boot.jar<\/code><\/pre>\n<p>\uff083\uff09\u505c\u6b62\u670d\u52a1<\/p>\n<pre><code class=\"language-bash\">java -jar C:\\Users\\yezhou\\.arthas\\lib\\3.3.9\\arthas\\arthas-client.jar 127.0.0.1 3658 -c &quot;stop&quot;<\/code><\/pre>\n<p>\uff084\uff09\u547d\u4ee4\u5217\u8868<\/p>\n<pre><code class=\"language-bash\">[arthas@26932]$ help\n NAME         DESCRIPTION\n help         Display Arthas Help\n keymap       Display all the available keymap for the specified connection.\n sc           Search all the classes loaded by JVM\n sm           Search the method of classes loaded by JVM\n classloader  Show classloader info\n jad          Decompile class\n getstatic    Show the static field of a class\n monitor      Monitor method execution statistics, e.g. total\/success\/failure count, average rt, fail rate, etc.\n stack        Display the stack trace for the specified class and method\n thread       Display thread info, thread stack\n trace        Trace the execution time of specified method invocation.\n watch        Display the input\/output parameter, return object, and thrown exception of specified method invocation\n tt           Time Tunnel\n jvm          Display the target JVM information\n perfcounter  Display the perf counter infornation.\n ognl         Execute ognl expression.\n mc           Memory compiler, compiles java files into bytecode and class files in memory.\n redefine     Redefine classes. @see Instrumentation#redefineClasses(ClassDefinition...)\n dashboard    Overview of target jvm&#039;s thread, memory, gc, vm, tomcat info.\n dump         Dump class byte array from JVM\n heapdump     Heap dump\n options      View and change various Arthas options\n cls          Clear the screen\n reset        Reset all the enhanced classes\n version      Display Arthas version\n session      Display current session information\n sysprop      Display, and change the system properties.\n sysenv       Display the system env.\n vmoption     Display, and update the vm diagnostic options.\n logger       Print logger info, and update the logger level\n history      Display command history\n cat          Concatenate and print files\n echo         write arguments to the standard output\n pwd          Return working directory name\n mbean        Display the mbean information\n grep         grep command for pipes.\n tee          tee command for pipes.\n profiler     Async Profiler. https:\/\/github.com\/jvm-profiling-tools\/async-profiler\n stop         Stop\/Shutdown Arthas server and exit the console.<\/code><\/pre>\n<h2>Arthas\u547d\u4ee4<\/h2>\n<h3>sc \u547d\u4ee4<\/h3>\n<p>\u547d\u4ee4\u4ecb\u7ecd\uff1a\u8be5\u547d\u4ee4\u662f<code>Search-Class<\/code>\u82f1\u6587\u7684\u7f29\u5199\uff0c\u7528\u4e8e\u67e5\u770bJVM\u5df2\u52a0\u8f7d\u7684\u7c7b\u4fe1\u606f<\/p>\n<p>\u5e38\u7528\u53c2\u6570\u8be6\u60c5<\/p>\n<ul>\n<li><code>-d<\/code>: \u53c2\u6570\u7528\u4e8e\u8f93\u51fa\u8be6\u7ec6\u7684\u7c7b\u76f8\u5173\u4fe1\u606f\uff08\u7c7b\u5168\u9650\u5b9a\u540d\uff0c\u5b58\u653e\u8def\u5f84\uff0c\u63a5\u53e3\uff0c\u6ce8\u89e3\uff0c\u7ee7\u627f\u7236\u7c7b\uff0c\u7c7b\u52a0\u8f7d\u5668\u7b49\uff09\uff0c\u652f\u6301\u6a21\u7cca\u67e5\u8be2<\/li>\n<li><code>-f<\/code>: \u53c2\u6570\u9700\u8981\u914d\u5408 -d \u547d\u4ee4\u4e00\u8d77\u4f7f\u7528\uff0c \u5728\u4e0a\u8ff0\u7c7b\u4fe1\u606f\u4e2d\u52a0\u5165\u5b57\u6bb5\u4fe1\u606f\uff0c\u5305\u62ec\u6743\u9650\u3001\u7c7b\u578b\u3001\u540d\u5b57<\/li>\n<\/ul>\n<p>\u4f8b\u5b50(\u4f7f\u7528\u6a21\u7cca\u7684\u65b9\u5f0f)\uff1a<\/p>\n<pre><code class=\"language-bash\">sc -d -f *TestController<\/code><\/pre>\n<pre><code class=\"language-bash\">[arthas@26932]$ sc -d -f *TestController\n class-info        cn.appblog.arthas.TestController\n code-source       \/E:\/Java-Project\/arthas\/target\/classes\/\n name              cn.appblog.arthas.TestController\n isInterface       false\n isAnnotation      false\n isEnum            false\n isAnonymousClass  false\n isArray           false\n isLocalClass      false\n isMemberClass     false\n isPrimitive       false\n isSynthetic       false\n simple-name       TestController\n modifier          public\n annotation        org.springframework.web.bind.annotation.RestController\n interfaces\n super-class       +-java.lang.Object\n class-loader      +-sun.misc.Launcher$AppClassLoader@18b4aac2\n                     +-sun.misc.Launcher$ExtClassLoader@64b8f8f4\n classLoaderHash   18b4aac2\n fields\n\nAffect(row-cnt:1) cost in 18 ms.<\/code><\/pre>\n<p>\u5176\u4ed6\u53c2\u6570\uff1a<\/p>\n<ul>\n<li><code>-E<\/code>: \u5f00\u542f\u6b63\u5219\u8868\u8fbe\u5f0f\u5339\u914d\uff0c\u9ed8\u8ba4\u4e3a\u901a\u914d\u7b26\u5339\u914d<\/li>\n<li><code>-c<\/code>: \u7c7b\u540d\u8868\u8fbe\u5f0f\u5339\u914d<\/li>\n<\/ul>\n<h3>sm \u547d\u4ee4<\/h3>\n<p>\u547d\u4ee4\u4ecb\u7ecd\uff1a\u8be5\u547d\u4ee4\u662f<code>Search-Method<\/code>\u82f1\u6587\u7684\u7f29\u5199\uff0c\u7528\u4e8e\u67e5\u770b\u5df2\u52a0\u8f7d\u7c7b\u7684\u65b9\u6cd5\u4fe1\u606f<\/p>\n<p>\u5e38\u7528\u53c2\u6570<\/p>\n<ul>\n<li><code>-d<\/code>: \u65b9\u6cd5\u8be6\u60c5<\/li>\n<\/ul>\n<p>\u4f8b\u5b50\uff1a\uff08\u6a21\u7cca\u5339\u914d\u627e\u5230<code>TestController<\/code>\u4e0b\u7684<code>abc<\/code>\u65b9\u6cd5\u8be6\u60c5\uff09<\/p>\n<pre><code class=\"language-bash\">sm -d *TestController abc<\/code><\/pre>\n<pre><code class=\"language-bash\">[arthas@26932]$ sm -d *TestController abc\n declaring-class  cn.appblog.arthas.TestController\n method-name      abc\n modifier         public\n annotation       org.springframework.web.bind.annotation.GetMapping\n parameters       java.lang.Integer\n return           cn.appblog.arthas.User\n exceptions\n classLoaderHash  18b4aac2\n\nAffect(row-cnt:1) cost in 17 ms.<\/code><\/pre>\n<p>\u975e\u5e38\u7528\u53c2\u6570\uff1a<\/p>\n<ul>\n<li><code>-E<\/code>: \u5f00\u542f\u6b63\u5219\u8868\u8fbe\u5f0f\u5339\u914d\uff0c\u9ed8\u8ba4\u4e3a\u901a\u914d\u7b26\u5339\u914d<\/li>\n<li><code>-c<\/code>: \u7c7b\u540d\u8868\u8fbe\u5f0f\u5339\u914d<\/li>\n<\/ul>\n<h3>jad \u547d\u4ee4<\/h3>\n<p>\u547d\u4ee4\u4ecb\u7ecd\uff1a\u8be5\u547d\u4ee4\u53ef\u4ee5\u53cd\u7f16\u8bd1\u51fa\u5df2\u52a0\u8f7d\u7c7b\u7684\u6e90\u4ee3\u7801\uff0c\u5982\u679c\u6ca1\u6709\u7ebf\u4e0b\u73af\u5883\uff0c\u6211\u4eec\u53ef\u4ee5\u5728\u7ebf\u4e0a\u67e5\u770b\u5230\u5e95\u54ea\u884c\u4ee3\u7801\u51fa\u95ee\u9898\u3002<\/p>\n<p>\u4f8b\u5b50\uff1a<\/p>\n<pre><code class=\"language-bash\">jad *TestController<\/code><\/pre>\n<pre><code class=\"language-bash\">[arthas@26932]$ jad *TestController\n\nClassLoader:\n+-sun.misc.Launcher$AppClassLoader@18b4aac2\n  +-sun.misc.Launcher$ExtClassLoader@64b8f8f4\n\nLocation:\n\/E:\/Java-Project\/arthas\/target\/classes\/\n\n\/*\n * Decompiled with CFR.\n *\n * Could not load the following classes:\n *  cn.appblog.arthas.User\n *\/\npackage cn.appblog.arthas;\n\nimport cn.appblog.arthas.User;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class TestController {\n    @GetMapping(value={&quot;test&quot;})\n    public User abc(Integer integer) {\n        if (integer == 0) {\n            throw new IllegalArgumentException(&quot;\u9359\u509b\u669f 0 \u5bee\u509a\u7236&quot;);\n        }\n        User user = new User();\n        user.setName(&quot;Joe.Ye&quot;);\n        user.setAge(integer);\n        return user;\n    }\n}\n\nAffect(row-cnt:1) cost in 860 ms.<\/code><\/pre>\n<h3>tt \u547d\u4ee4<\/h3>\n<p>tt \u547d\u4ee4\u6709\u70b9\u5f3a\uff0c\u4f7f\u7528\u8be5\u547d\u4ee4\uff0c\u4f1a\u6709\u4e00\u4e2a\u8bb0\u5f55\u8868\uff0c\u8bf7\u6c42\u6765\u65f6\uff0c\u4f1a\u5c06\u8bf7\u6c42\u8bb0\u5f55\u4e0b\u6765\uff0c\u53ef\u4ee5\u8fdb\u884c\u91cd\u653e\uff08\u7531 Arthas \u542f\u52a8\u7ebf\u7a0b\u8bf7\u6c42\uff09<\/p>\n<p>\u5e38\u7528\u53c2\u6570\uff1a<\/p>\n<ul>\n<li><code>-t<\/code>: \u5f00\u542f\u65b9\u6cd5\u76d1\u542c\uff0c\u8bb0\u5f55\u4e0b<code>TestController<\/code>\u4e2d\u65b9\u6cd5<code>abc<\/code>\u7684\u8c03\u7528\u60c5\u51b5<\/li>\n<\/ul>\n<pre><code class=\"language-bash\">tt -t *TestController abc<\/code><\/pre>\n<pre><code class=\"language-bash\">[arthas@26932]$ tt -t *TestController abc\nPress Q or Ctrl+C to abort.\nAffect(class count: 1 , method count: 1) cost in 110 ms, listenerId: 1\n INDEX  TIMESTAMP           COST(ms)   IS-RET  IS-EXP  OBJECT        CLASS                      METHOD\n-----------------------------------------------------------------------------------------------------------------------\n 1000   2020-08-20 15:44:32  0.675401   true   false   0x3d4f4fbf    TestController             abc             \n 1001   2020-08-20 15:44:45  0.2588     false  true    0x3d4f4fbf    TestController             abc\n 1002   2020-08-20 15:45:03  0.049399   true   false   0x3d4f4fbf    TestController             abc             <\/code><\/pre>\n<p>\u63a5\u4e0b\u6765\u6211\u4eec\u6309 Q \u6216\u8005 Ctrl+C \u9000\u51fa\u76d1\u542c\u3002<\/p>\n<ul>\n<li><code>-i<\/code>: <code>i<\/code>\u662f\u6307<code>index<\/code>\u7d22\u5f15\u7684\u610f\u601d\uff0c\u53ef\u4ee5\u7528\u6765\u627e\u51fa\u4e4b\u524d\u8bf7\u6c42\u7684\u4fe1\u606f<\/li>\n<\/ul>\n<pre><code class=\"language-bash\">tt -i 1000<\/code><\/pre>\n<pre><code class=\"language-bash\">[arthas@26932]$ tt -i 1000\n INDEX          1000\n GMT-CREATE     2020-08-20 15:44:32\n COST(ms)       0.675401\n OBJECT         0x3d4f4fbf\n CLASS          cn.appblog.arthas.TestController\n METHOD         abc\n IS-RETURN      true\n IS-EXCEPTION   false\n PARAMETERS[0]  @Integer[20]\n RETURN-OBJ     @User[\n                    name=@String[Joe.Ye],\n                    age=@Integer[20],\n                ]\nAffect(row-cnt:1) cost in 9 ms.<\/code><\/pre>\n<pre><code class=\"language-bash\">[arthas@26932]$ tt -i 1001\n INDEX            1001\n GMT-CREATE       2020-08-20 15:44:45\n COST(ms)         0.2588\n OBJECT           0x3d4f4fbf\n CLASS            cn.appblog.arthas.TestController\n METHOD           abc\n IS-RETURN        false\n IS-EXCEPTION     true\n PARAMETERS[0]    null\n THROW-EXCEPTION  java.lang.NullPointerException\n                        at cn.appblog.arthas.TestController.abc(TestController.java:16)\n                        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n                        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n                        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n                        at java.lang.reflect.Method.invoke(Method.java:498)\n                        at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)\n                        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)\n                        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)\n                        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:878)\n                        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:792)\n                        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\n                        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)\n                        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)\n                        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\n                        at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\n                        at javax.servlet.http.HttpServlet.service(HttpServlet.java:626)\n                        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\n                        at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)\n                        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)\n                        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n                        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\n                        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n                        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n                        at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\n                        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n                        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n                        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n                        at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\n                        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n                        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n                        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n                        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\n                        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n                        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n                        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n                        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)\n                        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)\n                        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)\n                        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)\n                        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\n                        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\n                        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)\n                        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)\n                        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)\n                        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)\n                        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1589)\n                        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\n                        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)\n                        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)\n                        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\n                        at java.lang.Thread.run(Thread.java:748)\n\nAffect(row-cnt:1) cost in 12 ms.<\/code><\/pre>\n<ul>\n<li><code>-l<\/code>: \u627e\u51fa\u5217\u8868\u6240\u6709\u8bf7\u6c42<\/li>\n<\/ul>\n<pre><code class=\"language-bash\">tt -l<\/code><\/pre>\n<pre><code class=\"language-bash\">[arthas@26932]$ tt -l\n INDEX  TIMESTAMP          COST(ms  IS-RE  IS-EXP  OBJECT        CLASS                      METHOD\n                           )        T\n-----------------------------------------------------------------------------------------------------------------------\n 1000   2020-08-20 15:44:32  0.675401  true   false   0x3d4f4fbf    TestController             abc\n 1001   2020-08-20 15:44:45  0.2588    false  true    0x3d4f4fbf    TestController             abc\n 1002   2020-08-20 15:45:03  0.049398  true   false   0x3d4f4fbf    TestController             abc\nAffect(row-cnt:3) cost in 3 ms.<\/code><\/pre>\n<ul>\n<li><code>-p<\/code>: \u8be5\u4e4b\u7c7b\u7528\u4e8e\u91cd\u505a\u4e00\u6b21\u8c03\u7528\uff0c\u4e00\u822c\u6765\u8bf4\uff0c\u524d\u7aef\u8c03\u8d77\u8bf7\u6c42\u540e\u3002\u7ed3\u679c\u4e4b\u524d\u6ca1\u770b\u5230\uff0c\u518d\u6b21\u5728\u524d\u7aef\u8c03\u8d77\u592a\u9ebb\u70e6\uff0c\u90a3\u4e48\u53ef\u4ee5\u4f7f\u7528\u8be5\u53c2\u6570<\/li>\n<\/ul>\n<pre><code class=\"language-bash\">tt -i 1000 -p<\/code><\/pre>\n<p>\u4e0a\u8ff0<code>1000<\/code>\u662f\u6307\u7d22\u5f15\uff0c\u91cd\u65b0\u8bf7\u6c42\u7c7b\u4f3c\u4e8e<code>-i<\/code>\u8f93\u51fa\u6d88\u606f<\/p>\n<pre><code class=\"language-bash\">[arthas@26932]$ tt -i 1000 -p\n RE-INDEX       1000\n GMT-REPLAY     2020-08-20 16:03:18\n OBJECT         0x3d4f4fbf\n CLASS          cn.appblog.arthas.TestController\n METHOD         abc\n PARAMETERS[0]  @Integer[20]\n IS-RETURN      true\n IS-EXCEPTION   false\n COST(ms)       0.200501\n RETURN-OBJ     @User[\n                    name=@String[Joe.Ye],\n                    age=@Integer[20],\n                ]\nTime fragment[1000] successfully replayed 1 times.<\/code><\/pre>\n<ul>\n<li><code>-n<\/code>: \u6307\u5b9a\u6293\u53d6\u6b21\u6570\uff0c\u8fbe\u5230\u6b21\u6570\u540e\u81ea\u52a8\u505c\u6b62<\/li>\n<\/ul>\n<pre><code class=\"language-bash\">tt -t *TestController abc -n 3<\/code><\/pre>\n<pre><code>[arthas@26932]$ tt -t *TestController abc -n 3\nPress Q or Ctrl+C to abort.\nAffect(class count: 1 , method count: 1) cost in 28 ms, listenerId: 2\n INDEX  TIMESTAMP          COST(ms)  IS-RET  IS-EXP  OBJECT        CLASS                      METHOD\n-----------------------------------------------------------------------------------------------------------------------\n 1003   2020-08-20 16:05:48  0.0771    true   false   0x3d4f4fbf    TestController             abc\n 1004   2020-08-20 16:05:48  0.0307    true   false   0x3d4f4fbf    TestController             abc\n 1005   2020-08-20 16:05:49  0.026501  true   false   0x3d4f4fbf    TestController             abc\nCommand execution times exceed limit: 3, so command will exit. You can set it with -n option.<\/code><\/pre>\n<ul>\n<li><code>-w<\/code>: \u7528\u4f5c\u8f93\u51fa\u4fe1\u606f\uff0c\u53ef\u4ee5\u627e\u51fa\u8bf7\u6c42\u8fc7\u7684\u4fe1\u606f\uff0c\u53c2\u6570\u3001\u4ee5\u53ca\u662f\u5426\u629b\u51fa\u5f02\u5e38<\/li>\n<\/ul>\n<p>\u627e\u51fa\u6b63\u5e38\u8fd4\u56de\u5bf9\u8c61\u3001\u5df2\u7ecf\u8bf7\u6c42\u53c2\u6570\u503c<\/p>\n<pre><code class=\"language-bash\">tt -i 1000 -w &#039;{params[0], target, returnObj}&#039;<\/code><\/pre>\n<pre><code class=\"language-bash\">[arthas@26932]$ tt -i 1000 -w &#039;{params[0], target, returnObj}&#039;\n@ArrayList[\n    @Integer[20],\n    @TestController[cn.appblog.arthas.TestController@3d4f4fbf],\n    @User[User(name=Joe.Ye, age=20)],\n]\nAffect(row-cnt:1) cost in 52 ms.<\/code><\/pre>\n<p>\u51fa\u73b0\u5f02\u5e38\u7684\u7ebf\u7a0b\uff0c\u627e\u51fa\u76f8\u5173\u5f02\u5e38\u4fe1\u606f<\/p>\n<pre><code class=\"language-bash\">tt -i 1001 -w &#039;{params[0], target,throwExp}&#039;<\/code><\/pre>\n<pre><code class=\"language-bash\">[arthas@26932]$ tt -i 1001 -w &#039;{params[0], target,throwExp}&#039;\n@ArrayList[\n    null,\n    @TestController[cn.appblog.arthas.TestController@3d4f4fbf],\n    @NullPointerException[java.lang.NullPointerException],\n]\nAffect(row-cnt:1) cost in 1 ms.<\/code><\/pre>\n<p>\u5982\u679c\u6211\u4eec\u53d1\u73b0\u5f02\u5e38\uff0c\u60f3\u770b\u770b\u4ec0\u4e48\u5f02\u5e38\uff0c\u600e\u4e48\u529e\u5462\uff1f<\/p>\n<pre><code class=\"language-bash\">tt -i 1001 -w throwExp<\/code><\/pre>\n<pre><code class=\"language-bash\">[arthas@26932]$ tt -i 1001 -w throwExp\njava.lang.NullPointerException\n        at cn.appblog.arthas.TestController.abc(TestController.java:16)\n        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n        at java.lang.reflect.Method.invoke(Method.java:498)\n        at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)\n        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)\n        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)\n        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:878)\n        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:792)\n        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\n        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)\n        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)\n        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\n        at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\n        at javax.servlet.http.HttpServlet.service(HttpServlet.java:626)\n        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\n        at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)\n        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)\n        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\n        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n        at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\n        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n        at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\n        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\n        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)\n        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)\n        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)\n        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)\n        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\n        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\n        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)\n        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)\n        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)\n        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)\n        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1589)\n        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\n        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)\n        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)\n        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\n        at java.lang.Thread.run(Thread.java:748)\n\nAffect(row-cnt:1) cost in 1 ms.<\/code><\/pre>\n<h3>dashboard<\/h3>\n<p>\u5f53\u524d\u7cfb\u7edf\u7684\u5b9e\u65f6\u6570\u636e\u9762\u677f\uff0c\u53ef\u4ee5\u663e\u793a JVM \u5185\u5b58\u4f7f\u7528\u60c5\u51b5\uff0cJava \u7248\u672c\u4fe1\u606f<\/p>\n<pre><code class=\"language-bash\">[arthas@26932]$ dashboard\nID        NAME                          GROUP               PRIORITY STATE     %CPU      TIME      INTERRUPT DAEMON\n5         Attach Listener               system              5        RUNNABLE  0         0:0       false     true\n20        Catalina-utility-1            main                1        WAITING   0         0:0       false     false\n21        Catalina-utility-2            main                1        TIMED_WAI 0         0:0       false     false\n38        DestroyJavaVM                 main                5        RUNNABLE  0         0:3       false     false\n3         Finalizer                     system              8        WAITING   0         0:0       false     true\n6         Monitor Ctrl-Break            main                5        RUNNABLE  0         0:0       false     true\n16        RMI Scheduler(0)              system              5        WAITING   0         0:0       false     true\n12        RMI TCP Accept-0              system              5        RUNNABLE  0         0:0       false     true\n2         Reference Handler             system              10       WAITING   0         0:0       false     true\n4         Signal Dispatcher             system              9        RUNNABLE  0         0:0       false     true\n54        Timer-for-arthas-dashboard-49 system              5        RUNNABLE  0         0:0       false     true\n46        arthas-NettyHttpTelnetBootstr system              5        RUNNABLE  0         0:0       false     true\n52        arthas-NettyHttpTelnetBootstr system              5        RUNNABLE  0         0:0       false     true\nMemory                    used    total    max     usage    GC\nheap                      100M    247M     3614M   2.79%    gc.ps_scavenge.count          5\nps_eden_space             62M     64M      1325M   4.69%    gc.ps_scavenge.time(ms)       105\nps_survivor_space         10M     10M      10M     99.87%   gc.ps_marksweep.count         2\nps_old_gen                28M     172M     2711M   1.03%    gc.ps_marksweep.time(ms)      194\nnonheap                   50M     56M      -1      89.09%\ncode_cache                3M      7M       240M    1.55%\nRuntime\nos.name                                                     Windows 10\nos.version                                                  10.0\njava.version                                                1.8.0_231\njava.home                                                   C:\\Program Files\\Java\\jdk1.8.0_231\\jre\nsystemload.average                                          -1.00\nprocessors                                                  4\nuptime                                                      3527s<\/code><\/pre>\n<h3>thread<\/h3>\n<p>\u5e38\u89c1\u53c2\u6570<\/p>\n<ul>\n<li><code>-i<\/code>: \u6307\u5b9a\u65f6\u95f4\u5185\u91c7\u96c6<\/li>\n<\/ul>\n<pre><code class=\"language-bash\">thread -i 2000<\/code><\/pre>\n<p>\u6548\u679c\u548c<code>thread<\/code>\u7c7b\u4f3c\uff0c\u4f46\u662f\u662f\u4e00\u6bb5\u65f6\u95f4\u6570\u636e<\/p>\n<pre><code class=\"language-bash\">[arthas@26932]$ thread -i 2000\nThreads Total: 32, NEW: 0, RUNNABLE: 12, BLOCKED: 0, WAITING: 16, TIMED_WAITING: 4, TERMINATED: 0\nID        NAME                          GROUP               PRIORITY STATE     %CPU      TIME      INTERRUPT DAEMON\n5         Attach Listener               system              5        RUNNABLE  0         0:0       false     true\n20        Catalina-utility-1            main                1        WAITING   0         0:0       false     false\n21        Catalina-utility-2            main                1        TIMED_WAI 0         0:0       false     false\n38        DestroyJavaVM                 main                5        RUNNABLE  0         0:3       false     false\n3         Finalizer                     system              8        WAITING   0         0:0       false     true\n6         Monitor Ctrl-Break            main                5        RUNNABLE  0         0:0       false     true\n16        RMI Scheduler(0)              system              5        WAITING   0         0:0       false     true\n12        RMI TCP Accept-0              system              5        RUNNABLE  0         0:0       false     true\n2         Reference Handler             system              10       WAITING   0         0:0       false     true\n4         Signal Dispatcher             system              9        RUNNABLE  0         0:0       false     true\n46        arthas-NettyHttpTelnetBootstr system              5        RUNNABLE  0         0:0       false     true\n52        arthas-NettyHttpTelnetBootstr system              5        RUNNABLE  0         0:0       false     true\n47        arthas-NettyWebsocketTtyBoots system              5        RUNNABLE  0         0:0       false     true\n50        arthas-UserStat               system              5        WAITING   0         0:0       false     true\n53        arthas-command-execute        system              5        RUNNABLE  0         0:1       false     true\n48        arthas-shell-server           system              5        TIMED_WAI 0         0:0       false     true\n49        arthas-shell-server           system              5        TIMED_WAI 0         0:0       false     true\n45        arthas-timer                  system              5        WAITING   0         0:0       false     true\n22        container-0                   main                5        TIMED_WAI 0         0:0       false     false\n36        http-nio-8080-Acceptor        main                5        RUNNABLE  0         0:0       false     true\n24        http-nio-8080-BlockPoller     main                5        RUNNABLE  0         0:0       false     true\n35        http-nio-8080-ClientPoller    main                5        RUNNABLE  0         0:0       false     true\n25        http-nio-8080-exec-1          main                5        WAITING   0         0:0       false     true\n34        http-nio-8080-exec-10         main                5        WAITING   0         0:0       false     true\n26        http-nio-8080-exec-2          main                5        WAITING   0         0:0       false     true\n27        http-nio-8080-exec-3          main                5        WAITING   0         0:0       false     true\n28        http-nio-8080-exec-4          main                5        WAITING   0         0:0       false     true<\/code><\/pre>\n<ul>\n<li><code>-n<\/code>: \u627e\u51fa cpu \u4f7f\u7528\u7387\u6700\u9ad8\u7684\u51e0\u4e2a\u7ebf\u7a0b<\/li>\n<\/ul>\n<pre><code class=\"language-bash\">thread -n 3<\/code><\/pre>\n<pre><code class=\"language-bash\">[arthas@26932]$ thread -n 3\n&quot;Reference Handler&quot; Id=2 cpuUsage=0% WAITING on java.lang.ref.Reference$Lock@94829b\n    at java.lang.Object.wait(Native Method)\n    -  waiting on java.lang.ref.Reference$Lock@94829b\n    at java.lang.Object.wait(Object.java:502)\n    at java.lang.ref.Reference.tryHandlePending(Reference.java:191)\n    at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)\n\n&quot;Finalizer&quot; Id=3 cpuUsage=0% WAITING on java.lang.ref.ReferenceQueue$Lock@63956277\n    at java.lang.Object.wait(Native Method)\n    -  waiting on java.lang.ref.ReferenceQueue$Lock@63956277\n    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)\n    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)\n    at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216)\n\n&quot;Signal Dispatcher&quot; Id=4 cpuUsage=0% RUNNABLE<\/code><\/pre>\n<ul>\n<li><code>-b<\/code><\/li>\n<\/ul>\n<p>\u627e\u5230\u6301\u6709\u9501\u7684\u7ebf\u7a0b\uff0c\u6709\u65f6\u5019\u8bf7\u6c42\u540e\uff0c\u4e00\u76f4\u5361\u4f4f\uff0c\u90a3\u4e48\u53ef\u4ee5\u4f7f\u7528\u8be5\u65b9\u5f0f\u53bb\u67e5\u627e\u6301\u6709\u9501\u7684\u7ebf\u7a0b\u3002\u6ce8\u610f\u8be5\u65b9\u5f0f\u4e0d\u652f\u6301\u663e\u793a\u9501\u4e5f\u5c31\u662f<code>lock<\/code>\u63a5\u53e3\u7684<\/p>\n<pre><code class=\"language-bash\">thread -b<\/code><\/pre>\n<pre><code class=\"language-bash\">[arthas@26932]$ thread -b\nNo most blocking thread found!<\/code><\/pre>\n<h3>jvm<\/h3>\n<p>\u8f93\u51fa jvm \u76f8\u5173\u4fe1\u606f\uff0c\u5305\u62ec\u52a0\u8f7d\u7c7b\u7684\u8def\u5f84\uff0c\u542f\u52a8\u7c7b\u8def\u5f84\uff0c\u52a0\u8f7d\u7c7b\u4e2a\u6570\u7b49\u7b49<\/p>\n<h3>trace \u547d\u4ee4<\/h3>\n<p>\u8be5\u547d\u4ee4\u6709\u70b9\u5f3a\uff0c\u7528\u4e8e\u67e5\u770b\u63a5\u53e3\u8c03\u7528\u65f6\u95f4\uff0c\u53ef\u4ee5\u627e\u51fa\u63a5\u53e3\u5728\u8c03\u7528\u4e0d\u540c\u65b9\u6cd5\u65f6\u6240\u82b1\u8d39\u7684\u65f6\u95f4\uff0c\u53ef\u4ee5\u7528\u4f5c\u6027\u80fd\u8c03\u4f18\u3002<\/p>\n<p>\u5e38\u7528\u53c2\u6570\uff1a<\/p>\n<ul>\n<li><code>-n<\/code>: \u6709\u65f6\u5019\u8bf7\u6c42\u91cf\u592a\u5927\uff0c\u6211\u4eec\u4e0d\u9700\u8981\u6bcf\u4e2a\u8bf7\u6c42\u8c03\u7528\u65f6\u95f4\uff0c\u90a3\u4e48\u53ef\u4ee5\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\uff0c\u6307\u5b9a\u6b21\u6570\u8c03\u7528\u540e\u7ed3\u675f\u3002<\/li>\n<\/ul>\n<pre><code class=\"language-bash\">trace *TestController abc -n 2<\/code><\/pre>\n<pre><code class=\"language-bash\">[arthas@26932]$ trace *TestController abc -n 2\nPress Q or Ctrl+C to abort.\nAffect(class count: 1 , method count: 1) cost in 66 ms, listenerId: 3\n`---ts=2020-08-20 16:29:51;thread_name=http-nio-8080-exec-6;id=1e;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@4f936da8\n    `---[0.2568ms] cn.appblog.arthas.TestController:abc()\n        +---[0.0362ms] cn.appblog.arthas.User:&lt;init&gt;() #19\n        +---[0.018ms] cn.appblog.arthas.User:setName() #20\n        `---[0.018599ms] cn.appblog.arthas.User:setAge() #21\n\n`---ts=2020-08-20 16:30:04;thread_name=http-nio-8080-exec-7;id=1f;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@4f936da8\n    `---[0.394099ms] cn.appblog.arthas.TestController:abc()\n        +---[0.0449ms] cn.appblog.arthas.User:&lt;init&gt;() #19\n        +---[0.0302ms] cn.appblog.arthas.User:setName() #20\n        `---[0.0576ms] cn.appblog.arthas.User:setAge() #21\n\nCommand execution times exceed limit: 2, so command will exit. You can set it with -n option.<\/code><\/pre>\n<p>\u6211\u4eec\u4e5f\u53ef\u4ee5\u8fdb\u884c\u7b5b\u9009\uff0c\u6bd4\u5982\u6211\u4eec\u8981\u627e\u51fa\u8bf7\u6c42\u65f6\u95f4\u5927\u4e8e 10ms \u7684\u7ebf\u7a0b\uff0c\u5982\u4e0b\u547d\u4ee4\u5373\u53ef\u3002<\/p>\n<pre><code class=\"language-bash\">trace *TestController abc &#039;#cost&gt;10&#039;<\/code><\/pre>\n<h3>watch \u547d\u4ee4<\/h3>\n<p>\u5e38\u7528\u53c2\u6570\uff1a<\/p>\n<ul>\n<li><code>-b<\/code>: \u5728\u8c03\u7528\u65b9\u6cd5\u524d\u89c2\u5bdf\u8fd9\u4e2a\u65b9\u6cd5\uff0c\u53ef\u4ee5\u770b\u5230\u4f20\u5165\u7684\u53c2\u6570\u503c<\/li>\n<\/ul>\n<pre><code class=\"language-bash\">watch -b *TestController abc params<\/code><\/pre>\n<pre><code class=\"language-bash\">[arthas@26932]$ watch -b *TestController abc params\nPress Q or Ctrl+C to abort.\nAffect(class count: 1 , method count: 1) cost in 28 ms, listenerId: 4\nts=2020-08-20 16:33:04; [cost=0.062801ms] result=@Object[][\n    @Integer[22],\n]\nts=2020-08-20 16:33:10; [cost=0.023ms] result=@Object[][\n    @Integer[25],\n]<\/code><\/pre>\n<ul>\n<li><code>-e<\/code>: \u89c2\u5bdf\u629b\u51fa\u5f02\u5e38\u65f6\u4f20\u5165\u53c2\u6570<\/li>\n<\/ul>\n<pre><code class=\"language-bash\">watch -e *TestController abc params<\/code><\/pre>\n<pre><code class=\"language-bash\">[arthas@26932]$ watch -e *TestController abc params\nPress Q or Ctrl+C to abort.\nAffect(class count: 1 , method count: 1) cost in 28 ms, listenerId: 5\nts=2020-08-20 16:34:22; [cost=0.200399ms] result=@Object[][\n    @Integer[0],\n]\nts=2020-08-20 16:34:43; [cost=0.880799ms] result=@Object[][\n    null,\n]<\/code><\/pre>\n<ul>\n<li><code>-f<\/code>: \u65b9\u6cd5\u8c03\u7528\u5b8c\u6210\uff0c\u8fd4\u56de\u5bf9\u8c61\u662f\u89c2\u5bdf\u5177\u4f53\u6570\u636e<\/li>\n<\/ul>\n<pre><code class=\"language-bash\">watch -f *TestController abc params<\/code><\/pre>\n<pre><code class=\"language-bash\">[arthas@26932]$ watch -f *TestController abc params\nPress Q or Ctrl+C to abort.\nAffect(class count: 1 , method count: 1) cost in 38 ms, listenerId: 6\nts=2020-08-20 16:36:37; [cost=0.0628ms] result=@Object[][\n    @Integer[22],\n]\nts=2020-08-20 16:36:55; [cost=0.6637ms] result=@Object[][\n    @Integer[0],\n]<\/code><\/pre>\n<p>\u5047\u8bbe\u6211\u4eec\u60f3\u89c2\u5bdf\u8be6\u7ec6\u4e00\u4e9b\u600e\u4e48\u505a\u5462\uff1f<br \/>\n\u5148\u770b\u770b\u6211\u4eec\u629b\u51fa\u5f02\u5e38\u7684\u60c5\u51b5\uff0c\u53ea\u662f\u770b\u5f02\u5e38\uff0c\u4e0d\u770b\u5177\u4f53\u5806\u6808<\/p>\n<pre><code class=\"language-bash\">watch *TestController abc &#039;{params,target,throwExp}&#039;<\/code><\/pre>\n<pre><code class=\"language-bash\">[arthas@26932]$ watch *TestController abc &#039;{params,target,throwExp}&#039;\nPress Q or Ctrl+C to abort.\nAffect(class count: 1 , method count: 1) cost in 29 ms, listenerId: 7\nts=2020-08-20 16:38:29; [cost=0.278899ms] result=@ArrayList[\n    @Object[][isEmpty=false;size=1],\n    @TestController[cn.appblog.arthas.TestController@3d4f4fbf],\n    @NullPointerException[java.lang.NullPointerException],\n]<\/code><\/pre>\n<p>\u67e5\u770b\u5177\u4f53\u5806\u6808\u7684\u5728\u540e\u9762\u52a0<code>-x 2<\/code>\uff0c\u610f\u601d\u662f\u8f93\u51fa<code>2<\/code>\u5c42\u7684\u7ed3\u679c\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u6211\u4eec\u53ea\u8f93\u51fa\u5f02\u5e38\uff08\u4e5f\u662f\u5c31\u9ed8\u8ba4<code>-x 1<\/code>\uff09<\/p>\n<pre><code class=\"language-bash\">watch *TestController abc &#039;{params,target,throwExp}&#039; -x 2<\/code><\/pre>\n<pre><code class=\"language-bash\">[arthas@26932]$ watch *TestController abc &#039;{params,target,throwExp}&#039; -x 2\nPress Q or Ctrl+C to abort.\nAffect(class count: 1 , method count: 1) cost in 26 ms, listenerId: 8\nts=2020-08-20 16:40:11; [cost=0.1639ms] result=@ArrayList[\n    @Object[][\n        null,\n    ],\n    @TestController[\n    ],\n    java.lang.NullPointerException\n        at cn.appblog.arthas.TestController.abc(TestController.java:16)\n        at sun.reflect.GeneratedMethodAccessor20.invoke(Unknown Source)\n        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n        at java.lang.reflect.Method.invoke(Method.java:498)\n        at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)\n        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)\n        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)\n        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:878)\n        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:792)\n        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\n        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)\n        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)\n        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\n        at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\n        at javax.servlet.http.HttpServlet.service(HttpServlet.java:626)\n        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\n        at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)\n        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)\n        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\n        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n        at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\n        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n        at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\n        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\n        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)\n        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)\n        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)\n        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)\n        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\n        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\n        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)\n        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)\n        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)\n        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)\n        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1589)\n        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\n        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)\n        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)\n        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\n        at java.lang.Thread.run(Thread.java:748)\n,\n]<\/code><\/pre>\n<p>\u53ef\u4ee5\u5c1d\u8bd5\u591a\u79cd\u60c5\u51b5\uff0c\u6bd4\u5982\u5c06\u6240\u6709\u53c2\u6570\uff0c\u8fd4\u56de\u7ed3\u679c\u90fd\u8f93\u51fa<\/p>\n<pre><code class=\"language-bash\">watch *TestController abc &#039;{params,target,returnObj}&#039; -x 2<\/code><\/pre>\n<pre><code class=\"language-bash\">[arthas@26932]$ watch *TestController abc &#039;{params,target,returnObj}&#039; -x 2\nPress Q or Ctrl+C to abort.\nAffect(class count: 1 , method count: 1) cost in 27 ms, listenerId: 9\nts=2020-08-20 16:41:37; [cost=0.0707ms] result=@ArrayList[\n    @Object[][\n        @Integer[22],\n    ],\n    @TestController[\n    ],\n    @User[\n        name=@String[Joe.Ye],\n        age=@Integer[22],\n    ],\n]<\/code><\/pre>\n<h3>stack \u547d\u4ee4<\/h3>\n<p>\u8be5\u547d\u4ee4\u9738\u9053\uff0c\u770b\u6e90\u7801\u6267\u884c\u65b9\u5f0f\u5fc5\u5907\u5440\u3002\u6bd4\u5982\uff1a\u6211\u4eec\u770b\u5230\u4e00\u4e2a\u6838\u5fc3\u65b9\u6cd5\uff0c\u4f46\u662f\u53d1\u73b0\u8fd9\u4e2a\u65b9\u6cd5\u4f1a\u88ab\u6267\u884c\u7684\u8def\u5f84\u5f88\u591a\uff0c\u6211\u4eec\u5f88\u96be\u627e\u5230\u5230\u5e95\u54ea\u4e2a\u6267\u884c\u4e86\uff0c\u90a3\u8fd9\u4e2a\u547d\u4ee4\u5c31\u4f53\u73b0\u5176\u5f3a\u5927\u4e4b\u5904\u4e86\u3002<\/p>\n<p>\u5e38\u7528\u547d\u4ee4\uff1a<\/p>\n<ul>\n<li><code>-n<\/code>: \u6307\u5b9a\u7ed3\u675f\u6b21\u6570\uff0c\u8fbe\u5230\u6b21\u6570\u5219\u81ea\u52a8\u9000\u51fa\uff0c\u4e0d\u7ee7\u7eed\u76d1\u542c<\/li>\n<\/ul>\n<pre><code class=\"language-bash\">stack *User setName -n 1<\/code><\/pre>\n<p>\u4e0a\u9762\u90a3\u4e2a\u547d\u4ee4\uff0c\u7528\u6211\u4eec\u4e00\u4e2a<code>User<\/code>\u7c7b\u7684<code>setName<\/code>\u65b9\u6cd5\u6765\u67e5\u770b\uff0c\u53d1\u73b0\u5c31\u662f\u6211\u4eec<code>TestController<\/code>\u8c03\u7528\u4e86\u3002<\/p>\n<pre><code>[arthas@26932]$ stack *User setName -n 1\nPress Q or Ctrl+C to abort.\nAffect(class count: 1 , method count: 1) cost in 27 ms, listenerId: 10\nts=2020-08-20 16:44:07;thread_name=http-nio-8080-exec-2;id=1a;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@4f936da8\n    @cn.appblog.arthas.User.setName()\n        at cn.appblog.arthas.TestController.abc(TestController.java:20)\n        at sun.reflect.GeneratedMethodAccessor20.invoke(null:-1)\n        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n        at java.lang.reflect.Method.invoke(Method.java:498)\n        at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)\n        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)\n        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)\n        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:878)\n        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:792)\n        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\n        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)\n        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)\n        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\n        at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\n        at javax.servlet.http.HttpServlet.service(HttpServlet.java:626)\n        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\n        at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)\n        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)\n        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\n        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n        at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\n        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n        at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\n        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\n        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)\n        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)\n        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)\n        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)\n        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\n        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\n        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)\n        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)\n        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)\n        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)\n        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1589)\n        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\n        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)\n        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)\n        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\n        at java.lang.Thread.run(Thread.java:748)\n\nCommand execution times exceed limit: 1, so command will exit. You can set it with -n option.<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Arthas\u7b80\u4ecb Arthas \u662fAlibaba\u5f00\u6e90\u7684Java\u8bca\u65ad\u5de5\u5177\uff0c\u6df1\u53d7\u5f00\u53d1\u8005\u559c\u7231\u3002\u5728\u7ebf\u6392\u67e5\u95ee\u9898\uff0c\u65e0\u9700\u91cd\u542f [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[419],"tags":[420],"class_list":["post-1687","post","type-post","status-publish","format-standard","hentry","category-jvm","tag-arthas"],"_links":{"self":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1687","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/comments?post=1687"}],"version-history":[{"count":0,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1687\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/media?parent=1687"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/categories?post=1687"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/tags?post=1687"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}