阿里重磅开源在线分析诊断工具Arthas(阿尔萨斯)
github地址:
Arthas

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
- - 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
对类进行反编译:
$ 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
观察方法执行的时候那个子调用比较慢:

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

阿里重磅开源在线分析诊断工具Arthas(阿尔萨斯)的更多相关文章
- 开源在线分析诊断工具Arthas(阿尔萨斯)--总结
阿里重磅开源在线分析诊断工具Arthas(阿尔萨斯) arthas用法 启动demo java -jar arthas-demo.jar 启动 java -jar arthas-boot.jar at ...
- 【Java】15分钟快速体验阿里Java诊断工具Arthas
[墙裂推荐]15分钟快速体验阿里Java诊断工具Arthas : https://alibaba.github.io/arthas/arthas-tutorials?language=cn&i ...
- java 诊断工具——Arthas
该说不说!小编做的这些功能,最讨厌的就是优化!某些前辈大佬写的代码小辈我实在不敢恭维!那逻辑!那sql! 接下来!今天的主角就登场了,阿里巴巴最近开源出来的一个针对 java 的工具,主要是针对 ja ...
- Java诊断工具Arthas
Java诊断工具Arthas 1. Arthas简介 Arthas是阿里开源的一个线上java诊断工具,发现阿里还是挺喜欢开源一些技术的,造福人类.昨天试用了一下,发现真是强大,解决了我工作两年的很多 ...
- Alibaba Java诊断工具Arthas之快速安装和简单使用
Alibaba Java诊断工具Arthas简单介绍 : 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 1.这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception ...
- 款阿里开源的 Java 诊断工具Arthas
Arthas是什么鬼? Arthas是一款阿里巴巴开源的 Java 线上诊断工具,功能非常强大,可以解决很多线上不方便解决的问题. Arthas诊断使用的是命令行交互模式,支持JDK6+,Linux. ...
- Arthas Alibaba 开源 Java 诊断工具
Arthas 用户文档 English Docs Arthas(阿尔萨斯) 能为你做什么? Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱. 当你遇到以下类似问题而束手无策时,A ...
- 阿里JAVA诊断工具Arthas的初步使用
Arthas 是Alibaba开源的Java诊断工具,主要解决以下问题: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 comm ...
- Arthas--Java在线分析诊断工具(阿尔萨斯)
序言 Arthas是一款阿里巴巴开源的 Java 线上诊断工具,功能非常强大,可以解决很多线上不方便解决的问题. 资料 https://blog.csdn.net/youanyyou/article/ ...
随机推荐
- 行为型模式(三) 迭代器模式(Iterator)
一.动机(Motivate) 在软件构建过程中,集合对象内部结构常常变化各异.但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素:同时这种"透明 ...
- java设计模式解析(1) Observer观察者模式
设计模式系列文章 java设计模式解析(1) Observer观察者模式 java设计模式解析(2) Proxy代理模式 java设计模式解析(3) Factory工厂模式 java设计模式解析( ...
- logstash-output-jdbc遇到connection is not available,request time out after 10000ms的问题解决
上一篇logstash-output-jdbc使用中提到“运行bin/logstash -f test.conf时可能提示注册插件失败”,通过分析详细的错误日志,发现其赫然写着“connection ...
- js通过html的url获取参数值
function getUrlParameter(name){ name = name.replace(/[]/,"\[").replace(/[]/,"\[" ...
- Centos7 源码安装PostgreSQL Citus集群 (转载)
citus的分布式集群目前在苏宁大规模应用,苏宁陈华军也做了很多技术分享和博客介绍.目前所有的教程都是rpm和pg一起安装,个人不喜欢,毕竟citus定位是个插件,我想在我已安装的pg上源码装一个ci ...
- BZOJ 2064: 分裂 状压动归
最多的操作次数是 $n+m-1$ (相当于把第一个暴力合并,再暴力拆成第二个).如果第一个序列的一个子序列和第二个区间的子序列相等,那么总次数就可以减 $2$.将第二个序列所有数取反,直接求解有多少个 ...
- JS学习之--比较两个Object数组是否相等
一.问题 在js中是不能直接用“==”或者“===”来计算两个数组是否相等的,那么就需要对数组的值进行比较: 二.次解决方案 对于比较两个数组次要的方法有如下几种,为什么说是次要解决方案呢?因为它不能 ...
- Codevs 1482 路线统计(矩阵乘法)
1482 路线统计 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description N个节点的有向图, 求从start到finish刚好经过时 ...
- 洛谷P1706全排列问题
P1706 全排列问题 题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入输出格式 输入格式: n(1≤n≤9) 输出格式: 由1-n组 ...
- flutter 监听返回
在项目中遇到了一个场景,A页面必须返回某个tab页,但是A页面可能会调到B,再跳到C,最后回到A.这个时候A的返回肯定是C. 想了一些解决方案,都不如监听A页面的实体键返回或者虚拟键返回来的快速便捷. ...