English version goes here.
Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。
当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到JVM的实时运行状态?
Arthas采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。
快速开始
Linux/Unix/Mac
安装Arthas:
curl -L https://alibaba.github.io/arthas/install.sh | sh
启动Arthas:
./as.sh
Windows
- 点击 这里 下载最新的Arthas zip包
- 解压缩zip包.
- 进入bin目录
- 执行以下命令
as.bat $PID
文档
社区正在进行英文版本的翻译工作,如果您有兴趣请在 这里留言。
案例展示
Dashboard
Thread
一目了然的了解系统的状态,哪些线程比较占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 -
"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 [email protected] -
at java.lang.Object.wait(Native Method) -
- waiting on [email protected] -
at java.lang.Object.wait(Object.java:503) -
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
jad
对类进行反编译:
$ jad javax.servlet.Servlet ClassLoader: [email protected] [email protected] [email protected] 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 -
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;[email protected]01 -
@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
观察方法执行的时候那个子调用比较慢:
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;[email protected][ -
@RequestFacade[[email protected]], -
@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