diff --git a/README.md b/README.md index 62c80eb06..385c1bce0 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,37 @@ English version goes [here](README_EN.md). `Arthas`采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 + + + +### 快速开始 + +#### Linux/Unix/Mac + +安装Arthas: + +``` +curl -L https://alibaba.github.io/arthas/install.sh | sh +``` + +启动Arthas: + +``` +./as.sh +``` + +#### Windows + +1. 点击 [这里](http://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22com.taobao.arthas%22%20AND%20a%3A%22arthas-packaging%22) 下载最新的Arthas zip包 +2. 解压缩zip包. +3. 进入bin目录 +4. 执行以下命令 `as.bat $PID` + + +### 文档 + +社区正在进行英文版本的翻译工作,如果您有兴趣请在 [这里](https://github.com/alibaba/arthas/issues/51)留言。 + * [用户文档](https://alibaba.github.io/arthas/) * [安装](https://alibaba.github.io/arthas/install-detail.html) * [快速入门](https://alibaba.github.io/arthas/quick-start.html) @@ -27,17 +58,197 @@ English version goes [here](README_EN.md). * [参与贡献](https://github.com/alibaba/arthas/blob/master/CONTRIBUTING.md) -## 截图展示 +### 案例展示 -### Dashboard +#### Dashboard * https://alibaba.github.io/arthas/dashboard ![dashboard](site/src/site/sphinx/_static/dashboard.png) +#### Thread -### Web Console +一目了然的了解系统的状态,哪些线程比较占cpu?他们到底在做什么? + +``` +$ thread -n 3 +"as-command-execute-daemon" Id=29 cpuUsage=75% RUNNABLE + at sun.management.ThreadImpl.dumpThreads0(Native Method) + at sun.management.ThreadImpl.getThreadInfo(ThreadImpl.java:440) + at com.taobao.arthas.core.command.monitor200.ThreadCommand$1.action(ThreadCommand.java:58) + at com.taobao.arthas.core.command.handler.AbstractCommandHandler.execute(AbstractCommandHandler.java:238) + at com.taobao.arthas.core.command.handler.DefaultCommandHandler.handleCommand(DefaultCommandHandler.java:67) + at com.taobao.arthas.core.server.ArthasServer$4.run(ArthasServer.java:276) + at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) + at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) + at java.lang.Thread.run(Thread.java:745) + + Number of locked synchronizers = 1 + - java.util.concurrent.ThreadPoolExecutor$Worker@6cd0b6f8 + +"as-session-expire-daemon" Id=25 cpuUsage=24% TIMED_WAITING + at java.lang.Thread.sleep(Native Method) + at com.taobao.arthas.core.server.DefaultSessionManager$2.run(DefaultSessionManager.java:85) + +"Reference Handler" Id=2 cpuUsage=0% WAITING on java.lang.ref.Reference$Lock@69ba0f27 + at java.lang.Object.wait(Native Method) + - waiting on java.lang.ref.Reference$Lock@69ba0f27 + at java.lang.Object.wait(Object.java:503) + at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133) +``` + +#### jad + +对类进行反编译: + +```java +$ jad javax.servlet.Servlet + +ClassLoader: ++-java.net.URLClassLoader@6108b2d7 + +-sun.misc.Launcher$AppClassLoader@18b4aac2 + +-sun.misc.Launcher$ExtClassLoader@1ddf84b8 + +Location: +/Users/xxx/work/test/lib/servlet-api.jar + +/* + * Decompiled with CFR 0_122. + */ +package javax.servlet; + +import java.io.IOException; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + +public interface Servlet { + public void init(ServletConfig var1) throws ServletException; + + public ServletConfig getServletConfig(); + + public void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException; + + public String getServletInfo(); + + public void destroy(); +} +``` + +#### sc + +查找JVM中已经加载的类 + +``` +$ sc -d org.springframework.web.context.support.XmlWebApplicationContext + class-info org.springframework.web.context.support.XmlWebApplicationContext + code-source /Users/xxx/work/test/WEB-INF/lib/spring-web-3.2.11.RELEASE.jar + name org.springframework.web.context.support.XmlWebApplicationContext + isInterface false + isAnnotation false + isEnum false + isAnonymousClass false + isArray false + isLocalClass false + isMemberClass false + isPrimitive false + isSynthetic false + simple-name XmlWebApplicationContext + modifier public + annotation + interfaces + super-class +-org.springframework.web.context.support.AbstractRefreshableWebApplicationContext + +-org.springframework.context.support.AbstractRefreshableConfigApplicationContext + +-org.springframework.context.support.AbstractRefreshableApplicationContext + +-org.springframework.context.support.AbstractApplicationContext + +-org.springframework.core.io.DefaultResourceLoader + +-java.lang.Object + class-loader +-org.apache.catalina.loader.ParallelWebappClassLoader + +-java.net.URLClassLoader@6108b2d7 + +-sun.misc.Launcher$AppClassLoader@18b4aac2 + +-sun.misc.Launcher$ExtClassLoader@1ddf84b8 + classLoaderHash 25131501 + +``` + +#### stack + +查看方法 `test.arthas.TestStack#doGet` 的调用堆栈: + +``` +$ stack test.arthas.TestStack doGet +Press Ctrl+C to abort. +Affect(class-cnt:1 , method-cnt:1) cost in 286 ms. +ts=2018-09-18 10:11:45;thread_name=http-bio-8080-exec-10;id=d9;is_daemon=true;priority=5;TCCL=org.apache.catalina.loader.ParallelWebappClassLoader@25131501 + @test.arthas.TestStack.doGet() + at javax.servlet.http.HttpServlet.service(HttpServlet.java:624) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110) + ... + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:451) + at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1121) + at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637) + at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) + at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) + at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.lang.Thread.run(Thread.java:745) +``` + +#### Trace + +观察方法执行的时候那个子调用比较慢: + +![trace](site/src/site/sphinx/_static/trace.png) + +#### Watch + +观察方法 `test.arthas.TestWatch#doGet` 执行的入参,仅当方法抛出异常时才输出。 + +``` +$ watch test.arthas.TestWatch doGet {params[0], throwExp} -e +Press Ctrl+C to abort. +Affect(class-cnt:1 , method-cnt:1) cost in 65 ms. +ts=2018-09-18 10:26:28;result=@ArrayList[ + @RequestFacade[org.apache.catalina.connector.RequestFacade@79f922b2], + @NullPointerException[java.lang.NullPointerException], +] +``` + +#### Classloader + +了解当前系统中有多少类加载器,以及每个加载器加载的类数量,帮助您判断是否有类加载器泄露。 + +``` +$ classloader + name numberOfInstances loadedCountTotal + BootstrapClassLoader 1 3346 + com.taobao.arthas.agent.ArthasClassloader 1 1262 + java.net.URLClassLoader 2 1033 + org.apache.catalina.loader.ParallelWebappClassLoader 1 628 + sun.reflect.DelegatingClassLoader 166 166 + sun.misc.Launcher$AppClassLoader 1 31 + com.alibaba.fastjson.util.ASMClassLoader 6 15 + sun.misc.Launcher$ExtClassLoader 1 7 + org.jvnet.hk2.internal.DelegatingClassLoader 2 2 + sun.reflect.misc.MethodUtil 1 1 +``` + +#### Web Console * https://alibaba.github.io/arthas/web-console ![web console](site/src/site/sphinx/_static/web-console-local.png) +