Arthas阿尔萨斯

2023-11-23 01:10
文章标签 arthas 阿尔萨斯

本文主要是介绍Arthas阿尔萨斯,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Arthas

arthas

 

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

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

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

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

在线教程(推荐)

  • 基础教程
  • 进阶教程

快速开始

使用arthas-boot(推荐)

下载arthas-boot.jar,然后用java -jar的方式启动:

wget https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar

打印帮助信息:

java -jar arthas-boot.jar -h
  • 如果下载速度比较慢,可以使用aliyun的镜像:java -jar arthas-boot.jar --repo-mirror aliyun --use-http

使用as.sh

Arthas 支持在 Linux/Unix/Mac 等平台上一键安装,请复制以下内容,并粘贴到命令行中,敲 回车 执行即可:

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

上述命令会下载启动脚本文件 as.sh 到当前目录,你可以放在任何地方或将其加入到 $PATH 中。

直接在shell下面执行./as.sh,就会进入交互界面。

也可以执行./as.sh -h来获取更多参数信息。

文档

  • 在线教程(推荐)
  • 用户文档
  • 安装
  • 快速入门
  • 进阶使用
  • 命令列表
  • Docker
  • 用户案例
  • 常见问题
  • 参与贡献
  • Release Notes
  • QQ群/钉钉群

Gitee文档镜像: https://arthas.gitee.io/

案例展示

Dashboard

  • https://alibaba.github.io/arthas/dashboard

dashboard

Thread

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

$ thread -n 3
"as-command-execute-daemon" Id=29 cpuUsage=75% RUNNABLEat 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_WAITINGat 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@69ba0f27at java.lang.Object.wait(Native Method)-  waiting on java.lang.ref.Reference$Lock@69ba0f27at java.lang.Object.wait(Object.java:503)at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)

jad

对类进行反编译:

$ jad javax.servlet.ServletClassLoader:
+-java.net.URLClassLoader@6108b2d7+-sun.misc.Launcher$AppClassLoader@18b4aac2+-sun.misc.Launcher$ExtClassLoader@1ddf84b8Location:
/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();
}

mc

Memory Compiler/内存编译器,编译.java文件生成.class

mc /tmp/Test.java

redefine

加载外部的.class文件,redefine jvm已加载的类。

redefine /tmp/Test.class
redefine -c 327a647b /tmp/Test.class /tmp/Test\$Inner.class

sc

查找JVM中已经加载的类

$ sc -d org.springframework.web.context.support.XmlWebApplicationContextclass-info        org.springframework.web.context.support.XmlWebApplicationContextcode-source       /Users/xxx/work/test/WEB-INF/lib/spring-web-3.2.11.RELEASE.jarname              org.springframework.web.context.support.XmlWebApplicationContextisInterface       falseisAnnotation      falseisEnum            falseisAnonymousClass  falseisArray           falseisLocalClass      falseisMemberClass     falseisPrimitive       falseisSynthetic       falsesimple-name       XmlWebApplicationContextmodifier          publicannotationinterfacessuper-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.Objectclass-loader      +-org.apache.catalina.loader.ParallelWebappClassLoader+-java.net.URLClassLoader@6108b2d7+-sun.misc.Launcher$AppClassLoader@18b4aac2+-sun.misc.Launcher$ExtClassLoader@1ddf84b8classLoaderHash   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],
]

Monitor

监控某个特殊方法的调用统计数据,包括总调用次数,平均rt,成功率等信息,每隔5秒输出一次。

$ monitor -c 5 org.apache.dubbo.demo.provider.DemoServiceImpl sayHello
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 109 ms.timestamp            class                                           method    total  success  fail  avg-rt(ms)  fail-rate
----------------------------------------------------------------------------------------------------------------------------2018-09-20 09:45:32  org.apache.dubbo.demo.provider.DemoServiceImpl  sayHello  5      5        0     0.67        0.00%timestamp            class                                           method    total  success  fail  avg-rt(ms)  fail-rate
----------------------------------------------------------------------------------------------------------------------------2018-09-20 09:45:37  org.apache.dubbo.demo.provider.DemoServiceImpl  sayHello  5      5        0     1.00        0.00%timestamp            class                                           method    total  success  fail  avg-rt(ms)  fail-rate
----------------------------------------------------------------------------------------------------------------------------2018-09-20 09:45:42  org.apache.dubbo.demo.provider.DemoServiceImpl  sayHello  5      5        0     0.43        0.00%

Time Tunnel(tt)

记录方法调用信息,支持事后查看方法调用的参数,返回值,抛出的异常等信息,仿佛穿越时空隧道回到调用现场一般。

$ tt -t org.apache.dubbo.demo.provider.DemoServiceImpl sayHello
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 75 ms.INDEX   TIMESTAMP            COST(ms)  IS-RET  IS-EXP   OBJECT         CLASS                          METHOD
-------------------------------------------------------------------------------------------------------------------------------------1000    2018-09-20 09:54:10  1.971195  true    false    0x55965cca     DemoServiceImpl                sayHello1001    2018-09-20 09:54:11  0.215685  true    false    0x55965cca     DemoServiceImpl                sayHello1002    2018-09-20 09:54:12  0.236303  true    false    0x55965cca     DemoServiceImpl                sayHello1003    2018-09-20 09:54:13  0.159598  true    false    0x55965cca     DemoServiceImpl                sayHello1004    2018-09-20 09:54:14  0.201982  true    false    0x55965cca     DemoServiceImpl                sayHello1005    2018-09-20 09:54:15  0.214205  true    false    0x55965cca     DemoServiceImpl                sayHello1006    2018-09-20 09:54:16  0.241863  true    false    0x55965cca     DemoServiceImpl                sayHello1007    2018-09-20 09:54:17  0.305747  true    false    0x55965cca     DemoServiceImpl                sayHello1008    2018-09-20 09:54:18  0.18468   true    false    0x55965cca     DemoServiceImpl                sayHello

Classloader

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

$ classloadername                                                  numberOfInstances  loadedCountTotalBootstrapClassLoader                                  1                  3346com.taobao.arthas.agent.ArthasClassloader             1                  1262java.net.URLClassLoader                               2                  1033org.apache.catalina.loader.ParallelWebappClassLoader  1                  628sun.reflect.DelegatingClassLoader                     166                166sun.misc.Launcher$AppClassLoader                      1                  31com.alibaba.fastjson.util.ASMClassLoader              6                  15sun.misc.Launcher$ExtClassLoader                      1                  7org.jvnet.hk2.internal.DelegatingClassLoader          2                  2sun.reflect.misc.MethodUtil                           1                  1

Web Console

  • https://alibaba.github.io/arthas/web-console

web console

Projects

  • greys-anatomy: Arthas代码基于Greys二次开发而来,非常感谢Greys之前所有的工作,以及Greys原作者对Arthas提出的意见和建议!
  • termd: Arthas的命令行实现基于termd开发,是一款优秀的命令行程序开发框架,感谢termd提供了优秀的框架。
  • crash: Arthas的文本渲染功能基于crash中的文本渲染功能开发,可以从这里看到源码,感谢crash在这方面所做的优秀工作。
  • cli: Arthas的命令行界面基于vert.x提供的cli库进行开发,感谢vert.x在这方面做的优秀工作。
  • compiler Arthas里的内存编绎器代码来源
  • Apache Commons Net Arthas里的Telnet Client代码来源

仓库镜像

  • 码云Arthas

这篇关于Arthas阿尔萨斯的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/414235

相关文章

Arthas问题排查工具

简介 Arthas 是Alibaba开源的Java诊断工具,动态跟踪Java代码;实时监控JVM状态,可以在不中断程序执行的情况下轻松完成JVM相关问题排查工作 。支持JDK 6+,支持Linux/Mac/Windows。这个工具真的很好用,而且入门超简单,十分推荐。 使用场景 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?我改的代码为什么没有执行到?难道是我没

Arthas工具使用,分析线上问题好帮手

在K8S中的步骤: #1.进入node #2.下载arthas 在容器中下载并启动 Arthas: java -jar arthas-boot.jar --repo-mirror aliyun --use-http #3.找到出现问题的类和方法的绝对路径 类路径 方法 #4.执行trace命令或者watch命令 trace:命令会追踪方法的执行轨迹,并在 n 次调用后返回跟踪信息

arthas使用分享

文章目录 准备启动Demo进入arthas控制台基础命令jvm相关class/classloader相关monitor/watch/trace相关options管道后台异步任务Web Console其他特性 准备 此文章目的不是为了解释什么,就是为了以后使用命令的时候有一个直观的感受 https://github.com/alibaba/arthas https://aliba

java性能监控利器Arthas

引言 性能调优是一个非常复杂,技术含量很高的高作,涉及到的知识面很广,而性能调优的第一步工作就是发现问题和定位问题,确定性能问题出现在那一部分,需要定位到具体的函数,类,SQL,某些参数的配置等等。那么我们在实际工作中怎么定位问题呢?肯定不能靠猜测和想象,尤其是我们线上出现了一些不是很容易复现的性能问题时。比较专业的开发人员肯定是会借助一些工具,以JAVA语言来说,如jdk自带的jvisualv

简明的Arthas故障排查实践

写在文章开头 Arthas是一款强大的开源Java诊断程序,它可以非常方便的启动并以界面式的方式和Java程序进行交互,支持监控程序的内存使用情况、线程信息、gc情况、甚至可以反编译并修改现上代码等。所以它成为笔者进行线上问题排查的重要手段,而本文将从实际使用的角度介绍一下arthas的基本使用技巧,希望对你有帮助。 Hi,我是 sharkChili ,是个不断在硬核技术上作死的 java

arthas源码刨析:启动 (1)

文章目录 arthas-bootBootstrap Created with Raphaël 2.3.0 开始 检查监听端口 jps 列表java应用 下载 lib 依赖 功能移交给 arthas-core 结束 arthas-boot 该module 的代码只有3个类

阿里性能诊断利器Arthas

1、介绍 Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?线上遇到某个用户的数据处理有问题,但线上同

牛叉了-arthas 热更新 mybatis mapper xml

测试环境能够热更新class 能否热更新mapper xml? arthas 群有同学提了这样的一个需求,必须满足满足 arthas-idea-plugin 2.8 版本 https://plugins.jetbrains.com/plugin/13581-arthas-idea 1、基本思路 1.1 流程图 1.2 实现效果 echo `redis-cli -h '127.0.0

arthas 获取spring被代理的目标对象

背景 记得一次问题排查,通过ognl 获取到 spring aop 代理过的cglib 代理对象的原始对象获取问题,spring的静态static spring context 进行调用获取被代理的目标对象的问题,记得当事是通过内部的一个工具 代理对象中被代理的目标对象 类似这个方法,通过静态的方法进行调用.挺方便的,但是这个方法比较麻烦,不是所有的工程都有这个方法,如何通过工具化让大家都能使用

arthas 火焰图神器-async-profiler

一、async-profiler This project is a low overhead sampling profiler for Java that does not suffer from Safepoint bias problem. It features HotSpot-specific APIs to collect stack traces and to track mem