Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
/ arthas Public
forked from alibaba/arthas

Alibaba Java Diagnostic Tool Arthas/Alibaba Java诊断利器Arthas

License

Notifications You must be signed in to change notification settings

Lowei/arthas

Repository files navigation

Arthas

arthas

English version goes here.

Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。

当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

  1. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  2. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  3. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  4. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  5. 是否有一个全局视角来查看系统的运行状况?
  6. 有什么办法可以监控到JVM的实时运行状态?

Arthas采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。

快速开始

Linux/Unix/Mac

安装Arthas:

curl -L https://alibaba.github.io/arthas/install.sh | sh

启动Arthas:

./as.sh

Windows

  1. 点击 这里 下载最新的Arthas zip包
  2. 解压缩zip包.
  3. 进入bin目录
  4. 执行以下命令 as.bat $PID

文档

社区正在进行英文版本的翻译工作,如果您有兴趣请在 这里留言。

案例展示

Dashboard

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.ThreadCommand1ドル.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.ArthasServer4ドル.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.DefaultSessionManager2ドル.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

对类进行反编译:

$ 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

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

web console

About

Alibaba Java Diagnostic Tool Arthas/Alibaba Java诊断利器Arthas

Resources

License

Contributing

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Java 95.0%
  • Python 1.9%
  • Shell 1.8%
  • CSS 0.5%
  • Batchfile 0.4%
  • JavaScript 0.2%
  • Other 0.2%

AltStyle によって変換されたページ (->オリジナル) /