程序员

Java诊断工具Arthas介绍

作者:admin 2021-08-18 我要评论

当你遇到以下类似问题而束手无策时 Arthas可以帮助你解决 这个类从哪个 jar 包加载的 为什么会报各种类相关的 Exception 我改的代码为什么没有执行到 难道是我没...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

image.png

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

这个类从哪个 jar 包加载的 为什么会报各种类相关的 Exception 我改的代码为什么没有执行到 难道是我没 commit 分支搞错了 遇到问题无法在线上 debug 难道只能通过加日志再重新发布吗 线上遇到某个用户的数据处理有问题 但线上同样无法 debug 线下无法重现 是否有一个全局视角来查看系统的运行状况 有什么办法可以监控到JVM的实时运行状态 怎么快速定位应用的热点 生成火焰图 怎样直接从JVM内查找某个类的实例

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

在线教程(推荐)使用方法快速开始使用arthas-boot(推荐)

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

curl -O https://arthas.aliyun.com/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://arthas.aliyun.com/install.sh | sh

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

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

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

文档在线教程(推荐)用户文档安装下载快速入门进阶使用命令列表WebConsoleDockerArthas Spring Boot Starter用户案例FAQ/常见问题编译调试/参与贡献Release NotesQQ群/钉钉群案例展示Dashboardhttps://arthas.aliyun.com/doc/dashboardThreadhttps://arthas.aliyun.com/doc/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)
jadhttps://arthas.aliyun.com/doc/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();
}
mchttps://arthas.aliyun.com/doc/mc

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

mc /tmp/Test.java
retransformhttps://arthas.aliyun.com/doc/retransform

加载外部的.class文件 retransform 热更新jvm已加载的类。

retransform /tmp/Test.class
retransform -c 327a647b /tmp/Test.class /tmp/Test\$Inner.class
schttps://arthas.aliyun.com/doc/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
vmtoolhttps://arthas.aliyun.com/doc/vmtool

从JVM heap中获取指定类的实例。

$ vmtool --action getInstances --className java.lang.String --limit 10
 String[][
 String[com/taobao/arthas/core/shell/session/Session],
 String[com.taobao.arthas.core.shell.session.Session],
 String[com/taobao/arthas/core/shell/session/Session],
 String[com/taobao/arthas/core/shell/session/Session],
 String[com/taobao/arthas/core/shell/session/Session.class],
 String[com/taobao/arthas/core/shell/session/Session.class],
 String[com/taobao/arthas/core/shell/session/Session.class],
 String[com/],
 String[java/util/concurrent/ConcurrentHashMap$ValueIterator],
 String[java/util/concurrent/locks/LockSupport],
]
stackhttps://arthas.aliyun.com/doc/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 is_daemon true;priority 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)
Tracehttps://arthas.aliyun.com/doc/trace

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

image.png

Watchhttps://arthas.aliyun.com/doc/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],
]
Monitorhttps://arthas.aliyun.com/doc/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)https://arthas.aliyun.com/doc/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 sayHello
 1001 2018-09-20 09:54:11 0.215685 true false 0x55965cca DemoServiceImpl sayHello
 1002 2018-09-20 09:54:12 0.236303 true false 0x55965cca DemoServiceImpl sayHello
 1003 2018-09-20 09:54:13 0.159598 true false 0x55965cca DemoServiceImpl sayHello
 1004 2018-09-20 09:54:14 0.201982 true false 0x55965cca DemoServiceImpl sayHello
 1005 2018-09-20 09:54:15 0.214205 true false 0x55965cca DemoServiceImpl sayHello
 1006 2018-09-20 09:54:16 0.241863 true false 0x55965cca DemoServiceImpl sayHello
 1007 2018-09-20 09:54:17 0.305747 true false 0x55965cca DemoServiceImpl sayHello
 1008 2018-09-20 09:54:18 0.18468 true false 0x55965cca DemoServiceImpl sayHello
Classloaderhttps://arthas.aliyun.com/doc/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 Consolehttps://arthas.aliyun.com/doc/web-console

image.png

Profiler/FlameGraph/火焰图https://arthas.aliyun.com/doc/profiler
$ profiler start
Started [cpu] profiling
$ profiler stop
profiler output file: /tmp/demo/arthas-output/20191125-135546.svg

通过浏览器查看profiler结果

image.png

Arthas Spring Boot StarterArthas Spring Boot StarterKnown Users

Arthas有超过120家登记用户 查看全部

如果您在使用Arthas 请让我们知道 您的使用对我们非常重要 https://github.com/alibaba/arthas/issues/111 按登记顺序排列

image.png



本文转自网络,原文链接:https://developer.aliyun.com/article/787223

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • Java诊断工具Arthas介绍

    Java诊断工具Arthas介绍

  • 阿里云—飞天计划学生机使用初体验

    阿里云—飞天计划学生机使用初体验

  • 基于java的土地档案管理系统

    基于java的土地档案管理系统

  • java中的正则匹配

    java中的正则匹配

腾讯云代理商
海外云服务器