github地址:

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

Thread

一目了然的了解系统的状态,哪些线程比较占cpu?他们到底在做什么?

  1.  
    $ thread -n 3
  2.  
    "as-command-execute-daemon" Id=29 cpuUsage=75% RUNNABLE
  3.  
    at sun.management.ThreadImpl.dumpThreads0(Native Method)
  4.  
    at sun.management.ThreadImpl.getThreadInfo(ThreadImpl.java:440)
  5.  
    at com.taobao.arthas.core.command.monitor200.ThreadCommand$1.action(ThreadCommand.java:58)
  6.  
    at com.taobao.arthas.core.command.handler.AbstractCommandHandler.execute(AbstractCommandHandler.java:238)
  7.  
    at com.taobao.arthas.core.command.handler.DefaultCommandHandler.handleCommand(DefaultCommandHandler.java:67)
  8.  
    at com.taobao.arthas.core.server.ArthasServer$4.run(ArthasServer.java:276)
  9.  
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
  10.  
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
  11.  
    at java.lang.Thread.run(Thread.java:745)
  12.  
     
  13.  
    Number of locked synchronizers = 1
  14.  
    - java.util.concurrent.ThreadPoolExecutor$Worker@6cd0b6f8
  15.  
     
  16.  
    "as-session-expire-daemon" Id=25 cpuUsage=24% TIMED_WAITING
  17.  
    at java.lang.Thread.sleep(Native Method)
  18.  
    at com.taobao.arthas.core.server.DefaultSessionManager$2.run(DefaultSessionManager.java:85)
  19.  
     
  20.  
    "Reference Handler" Id=2 cpuUsage=0% WAITING on java.lang.ref.Reference$Lock@69ba0f27
  21.  
    at java.lang.Object.wait(Native Method)
  22.  
    - waiting on java.lang.ref.Reference$Lock@69ba0f27
  23.  
    at java.lang.Object.wait(Object.java:503)
  24.  
    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中已经加载的类

  1.  
    $ sc -d org.springframework.web.context.support.XmlWebApplicationContext
  2.  
    class-info org.springframework.web.context.support.XmlWebApplicationContext
  3.  
    code-source /Users/xxx/work/test/WEB-INF/lib/spring-web-3.2.11.RELEASE.jar
  4.  
    name org.springframework.web.context.support.XmlWebApplicationContext
  5.  
    isInterface false
  6.  
    isAnnotation false
  7.  
    isEnum false
  8.  
    isAnonymousClass false
  9.  
    isArray false
  10.  
    isLocalClass false
  11.  
    isMemberClass false
  12.  
    isPrimitive false
  13.  
    isSynthetic false
  14.  
    simple-name XmlWebApplicationContext
  15.  
    modifier public
  16.  
    annotation
  17.  
    interfaces
  18.  
    super-class +-org.springframework.web.context.support.AbstractRefreshableWebApplicationContext
  19.  
    +-org.springframework.context.support.AbstractRefreshableConfigApplicationContext
  20.  
    +-org.springframework.context.support.AbstractRefreshableApplicationContext
  21.  
    +-org.springframework.context.support.AbstractApplicationContext
  22.  
    +-org.springframework.core.io.DefaultResourceLoader
  23.  
    +-java.lang.Object
  24.  
    class-loader +-org.apache.catalina.loader.ParallelWebappClassLoader
  25.  
    +-java.net.URLClassLoader@6108b2d7
  26.  
    +-sun.misc.Launcher$AppClassLoader@18b4aac2
  27.  
    +-sun.misc.Launcher$ExtClassLoader@1ddf84b8
  28.  
    classLoaderHash 25131501
  29.  
     

stack

查看方法 test.arthas.TestStack#doGet 的调用堆栈:

  1.  
    $ stack test.arthas.TestStack doGet
  2.  
    Press Ctrl+C to abort.
  3.  
    Affect(class-cnt:1 , method-cnt:1) cost in 286 ms.
  4.  
    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
  5.  
    @test.arthas.TestStack.doGet()
  6.  
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
  7.  
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
  8.  
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
  9.  
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
  10.  
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
  11.  
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
  12.  
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
  13.  
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
  14.  
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
  15.  
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
  16.  
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
  17.  
    ...
  18.  
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
  19.  
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
  20.  
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
  21.  
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:451)
  22.  
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1121)
  23.  
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
  24.  
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
  25.  
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
  26.  
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
  27.  
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
  28.  
    at java.lang.Thread.run(Thread.java:745)

Trace

观察方法执行的时候那个子调用比较慢:

Watch

观察方法 test.arthas.TestWatch#doGet 执行的入参,仅当方法抛出异常时才输出。

  1.  
    $ watch test.arthas.TestWatch doGet {params[0], throwExp} -e
  2.  
    Press Ctrl+C to abort.
  3.  
    Affect(class-cnt:1 , method-cnt:1) cost in 65 ms.
  4.  
    ts=2018-09-18 10:26:28;result=@ArrayList[
  5.  
    @RequestFacade[org.apache.catalina.connector.RequestFacade@79f922b2],
  6.  
    @NullPointerException[java.lang.NullPointerException],
  7.  
    ]

Classloader

了解当前系统中有多少类加载器,以及每个加载器加载的类数量,帮助您判断是否有类加载器泄露。

  1.  
    $ classloader
  2.  
    name numberOfInstances loadedCountTotal
  3.  
    BootstrapClassLoader 1 3346
  4.  
    com.taobao.arthas.agent.ArthasClassloader 1 1262
  5.  
    java.net.URLClassLoader 2 1033
  6.  
    org.apache.catalina.loader.ParallelWebappClassLoader 1 628
  7.  
    sun.reflect.DelegatingClassLoader 166 166
  8.  
    sun.misc.Launcher$AppClassLoader 1 31
  9.  
    com.alibaba.fastjson.util.ASMClassLoader 6 15
  10.  
    sun.misc.Launcher$ExtClassLoader 1 7
  11.  
    org.jvnet.hk2.internal.DelegatingClassLoader 2 2
  12.  
    sun.reflect.misc.MethodUtil 1 1

Web Console

阿里重磅开源在线分析诊断工具Arthas(阿尔萨斯)的更多相关文章

  1. 开源在线分析诊断工具Arthas(阿尔萨斯)--总结

    阿里重磅开源在线分析诊断工具Arthas(阿尔萨斯) arthas用法 启动demo java -jar arthas-demo.jar 启动 java -jar arthas-boot.jar at ...

  2. 【Java】15分钟快速体验阿里Java诊断工具Arthas

    [墙裂推荐]15分钟快速体验阿里Java诊断工具Arthas : https://alibaba.github.io/arthas/arthas-tutorials?language=cn&i ...

  3. java 诊断工具——Arthas

    该说不说!小编做的这些功能,最讨厌的就是优化!某些前辈大佬写的代码小辈我实在不敢恭维!那逻辑!那sql! 接下来!今天的主角就登场了,阿里巴巴最近开源出来的一个针对 java 的工具,主要是针对 ja ...

  4. Java诊断工具Arthas

    Java诊断工具Arthas 1. Arthas简介 Arthas是阿里开源的一个线上java诊断工具,发现阿里还是挺喜欢开源一些技术的,造福人类.昨天试用了一下,发现真是强大,解决了我工作两年的很多 ...

  5. Alibaba Java诊断工具Arthas之快速安装和简单使用

    Alibaba Java诊断工具Arthas简单介绍 : 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 1.这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception ...

  6. 款阿里开源的 Java 诊断工具Arthas

    Arthas是什么鬼? Arthas是一款阿里巴巴开源的 Java 线上诊断工具,功能非常强大,可以解决很多线上不方便解决的问题. Arthas诊断使用的是命令行交互模式,支持JDK6+,Linux. ...

  7. Arthas Alibaba 开源 Java 诊断工具

    Arthas 用户文档 English Docs Arthas(阿尔萨斯) 能为你做什么? Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱. 当你遇到以下类似问题而束手无策时,A ...

  8. 阿里JAVA诊断工具Arthas的初步使用

    Arthas 是Alibaba开源的Java诊断工具,主要解决以下问题: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 comm ...

  9. Arthas--Java在线分析诊断工具(阿尔萨斯)

    序言 Arthas是一款阿里巴巴开源的 Java 线上诊断工具,功能非常强大,可以解决很多线上不方便解决的问题. 资料 https://blog.csdn.net/youanyyou/article/ ...

随机推荐

  1. new 运算符的原理

    关于 new 运算符的原理: 1.红宝书上解释: (1)创建一个新对象 (2)将构造函数的作用域赋给新对象 (3)执行构造函数中的代码 (4)返回新对象 2.MDN上的解释: (1)一个继承自 Foo ...

  2. Oracle SQL developer客户端 如何连接已经安装完毕的Oracle服务器端

    对于刚刚安装完毕Oracle数据库后不知道如何链接使用,可参考以下解决方案. Part 1 首先说服务: 如果正确安装Oracle 11g客户端的朋友们注意了,想要Oracle数据库正常启动有如下三个 ...

  3. 2019牛客多校第三场 F.Planting Trees

    题目链接 题目链接 题解 题面上面很明显的提示了需要严格\(O(n^3)\)的算法. 先考虑一个过不了的做法,枚举右下角的\((x,y)\),然后二分矩形面积,枚举其中一边,则复杂度是\(O(n^3 ...

  4. vue和react原理性知识点

    Vue组件如何通信? computed和watch有什么区别? Vue是如何实现双向绑定的? Proxy与Object.defineProperty的优劣对比? 你是如何理解Vue的响应式系统的? 既 ...

  5. Eclipse的tab键为4个空格完整方法 附:阿里代码开发规范书

    开发规范书:http://pan.baidu.com/s/1dESdyox 1.点击 window->preference-,依次选择 General->Editors->Text ...

  6. JanusGraph 创建索引步骤(composite index)踩坑总结

    前言 JanusGraph是一个图数据库引擎,安装及入门可以参考 JanusGraph 图数据库安装小记.为了提高查询速度,在使用过程中一般要为某些属性创建索引.这篇随笔主要是记录创建索引过程中踩过的 ...

  7. 洛谷 P816 忠诚 题解

    每日一题 day28 打卡 Analysis 这道题用线段树维护区间最小值很简单,因为没有修改所以连lazy_tag都不用,但是这道题可以用树状数组维护区间最小值,非常骚气. 线段树代码: #incl ...

  8. 洛谷 P2661 信息传递 题解

    P2661 信息传递 题目描述 有 \(n\) 个同学(编号为 \(1\) 到 \(n\) )正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为 \(i\) 的同学的信息传 ...

  9. 2017.10.3 国庆清北 D3T2 公交车

    题目描述 LYK在玩一个游戏. 有k群小怪兽想乘坐公交车.第i群小怪兽想从xi出发乘坐公交车到yi.但公交车的容量只有M,而且这辆公交车只会从1号点行驶到n号点. LYK想让小怪兽们尽可能的到达自己想 ...

  10. Neither shaken nor stirred(DFS理解+vector存图)

    题目链接:http://acm.timus.ru/problem.aspx?space=1&num=2013 题目理解: 给定n个点的有向图: 下面n行,第一个数字表示点权,后面一个数字m表示 ...