本文主要是介绍Arthas,一个JAVA项目分析/诊断工具在mac上的试用记录(命令详细示例),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
之前看到的一个分析java项目的工具arthas,最近有时间试用整理下。用熟了就可以分析很多问题了,岂不美哉。虽然已经有很多分析工具 jvisualvm,jstat,jmap,jstack,Eclipse Memory Analyzer等。但可能不是大杂烩,或者线上无法分析等。所以看看arthas的功能,好用就用它了。
Arthas简介
Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到JVM的实时运行状态?
- 怎么快速定位应用的热点,生成火焰图?
Arthas支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。
扩展:java Instrumentation指的是可以用独立于应用程序之外的代理(agent)程序来监测和协助运行在JVM上的应用程序。这种监测和协助包括但不限于获取JVM运行时状态,替换和修改类定义等。 Arthas 的整体逻辑也是在 Java 的Instrumentation基础上来实现。
参考:(JAVA Instrumentation)https://blog.csdn.net/productshop/article/details/50623626
(Arthas 源码原理)https://blog.csdn.net/chainhou/article/details/105007699
Arthas的操作流程(简易)
官方提供了两种使用方式 下载arthas-boot.jar 或者直接安装使用 as. sh。 这里说明前一种。
一、下载arthas-boot.jar
打开命令行操作
chl> $ curl -O https://alibaba.github.io/arthas/arthas-boot.jar% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed0 0 0 0 0 0 0 0 --:--:-- 0:00:43 --:--:-- 0
会将目标文件下载到当前目录中。
二、运行arthas-boot.jar
可以看到执行 java -jar arthas-boot.jar之后,它罗列了当前的java进程供你选择,选择之后,就可以对该进程进行监控了。(也可以直接增加pid监控,如:java -jar arthas-boot.jar pid)。 在选择好pid之后,它首先会将 arthas所需要的jar相关文件进行下载,然后做一些初始化的工作。
chl> $ java -jar arthas-boot.jar
[INFO] arthas-boot version: 3.1.8
[INFO] Process 7457 already using port 3658
[INFO] Process 7457 already using port 8563
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 7457 org.apache.zookeeper.server.quorum.QuorumPeerMain[2]: 304 [3]: 9628
1
[INFO] Start download arthas from remote server: https://maven.aliyun.com/repository/public/com/taobao/arthas/arthas-packaging/3.1.8/arthas-packaging-3.1.8-bin.zip
[INFO] File size: 10.82 MB, downloaded size: 1.60 MB, downloading ...
[INFO] File size: 10.82 MB, downloaded size: 2.17 MB, downloading ...
[INFO] File size: 10.82 MB, downloaded size: 2.81 MB, downloading ...
[INFO] File size: 10.82 MB, downloaded size: 3.39 MB, downloading ...
[INFO] File size: 10.82 MB, downloaded size: 3.90 MB, downloading ...
[INFO] File size: 10.82 MB, downloaded size: 4.53 MB, downloading ...
[INFO] File size: 10.82 MB, downloaded size: 4.96 MB, downloading ...
[INFO] File size: 10.82 MB, downloaded size: 5.63 MB, downloading ...
[INFO] File size: 10.82 MB, downloaded size: 6.32 MB, downloading ...
[INFO] File size: 10.82 MB, downloaded size: 6.89 MB, downloading ...
[INFO] File size: 10.82 MB, downloaded size: 7.43 MB, downloading ...
[INFO] File size: 10.82 MB, downloaded size: 8.00 MB, downloading ...
[INFO] File size: 10.82 MB, downloaded size: 8.64 MB, downloading ...
[INFO] File size: 10.82 MB, downloaded size: 8.88 MB, downloading ...
[INFO] File size: 10.82 MB, downloaded size: 9.11 MB, downloading ...
[INFO] File size: 10.82 MB, downloaded size: 9.40 MB, downloading ...
[INFO] File size: 10.82 MB, downloaded size: 9.89 MB, downloading ...
[INFO] File size: 10.82 MB, downloaded size: 10.40 MB, downloading ...
[INFO] Download arthas success.
[INFO] arthas home: /Users/chenhailong/.arthas/lib/3.1.8/arthas
[INFO] The target process already listen port 3658, skip attach.
[INFO] arthas-client connect 127.0.0.1 3658,---. ,------. ,--------.,--. ,--. ,---. ,---. / O \ | .--. ''--. .--'| '--' | / O \ ' .-'
| .-. || '--'.' | | | .--. || .-. |`. `-.
| | | || |\ \ | | | | | || | | |.-' |
`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----' wiki https://alibaba.github.io/arthas
tutorials https://alibaba.github.io/arthas/arthas-tutorials
version 3.1.8
pid 7457
time 2020-04-08 10:59:25 [arthas@7457]$
注:最后一行‘[arthas@7457]$’ ,说明打开进入了监控客户端,在这里就可以执行相关命令进行查看了。 可以使用quit(退出当前客户端)、stop\shutdown(关闭arthas服务端,并退出所有客户端)。除了在命令行查看外,还可以通过浏览器访问http://127.0.0.1:8563/查看。如下图:
。
当我们在shell端执行quit,并重新java -jar arthas-boot.jar 7457当前进程后。会有这样一个提示(表示目标进程已被监听,跳过attach):
The target process already listen port 3658, skip attach.
attach机制:Java提供了attach机制。通过attach机制,我们可以直接attach到目标JVM进程,然后进行一些操作,比如获取内存dump、线程dump,类信息统计(比如已加载的类以及实例个数等),动态加载agent,动态设置vm flag(但是并不是所有的flag都可以设置的,因为有些flag是在jvm启动过程中使用的,是一次性的),打印vm flag,获取系统属性等。
attach简介及示例参考:https://www.jianshu.com/p/39d189961773
这里是下载好之后的文件列表,也就是直接执行第二种安装方式‘curl -L https://alibaba.github.io/arthas/install.sh | sh’安装的文件。
chl> $ ls
arthas-agent.jar arthas-client.jar arthas-demo.jar arthas.properties as.bat async-profiler logback.xml
arthas-boot.jar arthas-core.jar arthas-spy.jar as-service.bat as.sh install-local.sh
chl> $ pwd
/Users/chenhailong/.arthas/lib/3.1.8/arthas
客户端保持30分钟内有效,超时即会过期,需要重新连接
[arthas@7457]$ session (c8efe0df-0343-4cf0-bec8-c5f57865e3c1) is closed because session is inactive for 30 min(s).
三、操作arthas
通过输入help可以看到,Oh My God!~~~~,提供了这么多的功能。而且做的很友好,有tab自动补全功能,
以下列表中标有注1的需要知道,这些命令通过asm字节码增强技术来实现,会在指定的方法中插入一些切面来实现数据统计及观测功能。因此在线上、预发环境使用时,要明确需要观测的类、方法及条件。诊断结束后要shutdown或者执行reset命令。
[arthas@7457]$ helpNAME DESCRIPTION## 显示帮助help Display Arthas Help## 显示快捷键列表keymap Display all the available keymap for the specified connection.## 查看JVM已经加载的类信息sc Search all the classes loaded by JVM## 查看JVM已经加载的类的方法的信息sm Search the method of classes loaded by JVM## 查看类加载器信息classloader Show classloader info## 反编译类文件jad Decompile class## 查看类的静态属性getstatic Show the static field of a class## 方法监控(注1)monitor Monitor method execution statistics, e.g. total/success/failure count, average rt, fail rate, etc.## 方法的调用路径(注1)stack Display the stack trace for the specified class and method## 显示当前的jvm线程信息thread Display thread info, thread stack## 方法内部调用路径,并输出方法路径上的每个节点耗时(注1)trace Trace the execution time of specified method invocation.## 方法的执行信息监测(注1)watch Display the input/output parameter, return object, and thrown exception of specified method invocation## 方法 执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测(注1)tt Time Tunnel## 显示当前的jvm信息jvm Display the target JVM informationperfcounter Display the perf counter infornation.ognl Execute ognl expression.mc Memory compiler, compiles java files into bytecode and class files in memory.redefine Redefine classes. @see Instrumentation#redefineClasses(ClassDefinition...)## 监控目标系统的实时数据版面,包括jvm,thread,gc,vm等dashboard Overview of target jvm's thread, memory, gc, vm, tomcat info.## dump已经加载的类的信息dump Dump class byte array from JVMheapdump Heap dump## 查看或更改arthas设置options View and change various Arthas options## 清屏cls Clear the screen## 重置增强类,将被arthas增强过的类全部还原reset Reset all the enhanced classes## 输出arthas版本信息version Display Arthas version## 查看当前会话信息session Display current session information## 显示、修改JVM系统熟悉信息sysprop Display, and change the system properties.sysenv Display the system env.vmoption Display, and update the vm diagnostic options.## 打印日志级别logger Print logger info, and update the logger level## 显示命令执行记录history Display command historycat Concatenate and print filesecho write arguments to the standard outputpwd Return working directory namembean Display the mbean information## 管道操作grep grep command for pipes.tee tee command for pipes.profiler Async Profiler. https://github.com/jvm-profiling-tools/async-profiler## 关闭服务端stop Stop/Shutdown Arthas server and exit the console.
这里就挑几个常用的命令进行展示:
- dashboard:查看jvm\线程\env基本信息
- thread:查看线程的运行状态
- jad:反编译class文件[通过自动补全,查找上线代码是否包含自己新增的功能,很方便]
!!!【以下的这几个通过简单测试代码进行试用】
- sc:查看jvm中已经加载的类信息
- stack:调用栈信息
- Track:观察方法执行的时候哪个子调用比较慢:
- watch:观察方法的执行入参
- monitor:监控某个特殊方法的调用统计数据,包括总调用次数,平均rt,成功率等信息,每隔5秒输出一次。
3.1 dashboard
主要展示了三部分内容,线程,jvm,java-env。每过几秒会自动刷新
## 线程部分
ID NAME GROUP PRIORITY STATE %CPU TIME INTERRUPTED DAEMON
64 Timer-for-arthas-dashboard-97244c33-b0c9-4f81-b9a5 system 10 RUNNABLE 100 0:0 false true
15 Attach Listener system 9 RUNNABLE 0 0:0 false true
3 Finalizer system 8 WAITING 0 0:0 false true
11 NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181 main 5 RUNNABLE 0 0:2 false true
14 ProcessThread(sid:0 cport:2181): main 5 WAITING 0 0:0 false false
10 RMI TCP Accept-0 system 5 RUNNABLE 0 0:0 false true
2 Reference Handler system 10 WAITING 0 0:0 false true
12 SessionTracker main 5 TIMED_WAITING 0 0:1 false false
4 Signal Dispatcher system 9 RUNNABLE 0 0:0 false true
13 SyncThread:0 main 5 WAITING 0 0:0 false false
46 arthas-shell-server system 9 TIMED_WAITING 0 0:0 false true
63 as-command-execute-daemon system 10 TIMED_WAITING 0 0:0 false true
43 job-timeout system 9 TIMED_WAITING 0 0:0 false true
1 main main 5 WAITING 0 0:0 false false
44 nioEventLoopGroup-2-1 system 10 RUNNABLE 0 0:0 false false
49 nioEventLoopGroup-2-2 system 10 RUNNABLE 0 0:0 false false
57 nioEventLoopGroup-2-3 system 10 RUNNABLE 0 0:0 false false
59 nioEventLoopGroup-2-4 system 10 RUNNABLE 0 0:0 false false
45 nioEventLoopGroup-3-1 system 10 RUNNABLE 0 0:0 false false
50 nioEventLoopGroup-3-2 system 10 RUNNABLE 0 0:0 false false
51 nioEventLoopGroup-3-3 system 10 RUNNABLE 0 0:0 false false
52 nioEventLoopGroup-3-4 system 10 RUNNABLE 0 0:0 false false
53 nioEventLoopGroup-3-5 system 10 RUNNABLE 0 0:0 false false
54 nioEventLoopGroup-3-6 system 10 RUNNABLE 0 0:0 false false
55 nioEventLoopGroup-3-7 system 10 RUNNABLE 0 0:0 false false
56 nioEventLoopGroup-3-8 system 10 RUNNABLE 0 0:0 false false
47 pool-2-thread-1 system 5 WAITING 0 0:0 false false ## JVM内存使用情况
Memory used total max usage GC
heap 101M 323M 1820M 5.58% gc.ps_scavenge.count 8
ps_eden_space 65M 247M 648M 10.11% gc.ps_scavenge.time(ms) 199
ps_survivor_space 15M 15M 15M 99.92% gc.ps_marksweep.count 1
ps_old_gen 20M 60M 1365M 1.50% gc.ps_marksweep.time(ms) 160
nonheap 46M 47M -1 98.30%
code_cache 9M 9M 240M 4.07%
metaspace 33M 33M -1 98.29%
compressed_class_space 3M 4M 1024M 0.39%
direct 66K 66K - 100.00%
mapped 0K 0K - NaN% ##运行环境信息
Runtime
os.name Mac OS X
os.version 10.13.6
java.version 1.8.0_171
java.home /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre
systemload.average 2.07
processors 4
uptime 48084s
3.2 Thread
可以用来显示线程的一些基本信息,使用语法如下
USAGE:thread [-b] [-i <value>] [--state <value>] [-n <value>] [id] SUMMARY: Display thread info, thread stack EXAMPLES:threadthread 51thread -n -1thread -n 5thread -bthread -i 2000thread --state BLOCKEDWIKI: https://alibaba.github.io/arthas/thread OPTIONS: -b, --include-blocking-thread Find the thread who is holding a lock that blocks the most number of threads. -i, --sample-interval <value> Specify the sampling interval (in ms) when calculating cpu usage. --state <value> Display the thead filter by the state. NEW, RUNNABLE, TIMED_WAITING, WAITING, BLOCKED, TERMINATED is optional. -n, --top-n-threads <value> The number of thread(s) to show, ordered by cpu utilization, -1 to show all. <id> Show thread stack
例如使用 -n ,显示几条线程信息,根据cpu使用率排序
[arthas@7457]$ thread -n 3
"as-command-execute-daemon" Id=67 cpuUsage=82% RUNNABLEat sun.management.ThreadImpl.dumpThreads0(Native Method)at sun.management.ThreadImpl.getThreadInfo(ThreadImpl.java:448)at com.taobao.arthas.core.command.monitor200.ThreadCommand.processTopBusyThreads(ThreadCommand.java:179)at com.taobao.arthas.core.command.monitor200.ThreadCommand.process(ThreadCommand.java:100)at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl.process(AnnotatedCommandImpl.java:82)at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl.access$100(AnnotatedCommandImpl.java:18)at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl$ProcessHandler.handle(AnnotatedCommandImpl.java:111)at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl$ProcessHandler.handle(AnnotatedCommandImpl.java:108)at com.taobao.arthas.core.shell.system.impl.ProcessImpl$CommandProcessTask.run(ProcessImpl.java:371)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at java.lang.Thread.run(Thread.java:748)Number of locked synchronizers = 1- java.util.concurrent.ThreadPoolExecutor$Worker@ddde109"SessionTracker" Id=12 cpuUsage=17% TIMED_WAITING on org.apache.zookeeper.server.SessionTrackerImpl@296b6b0aat java.lang.Object.wait(Native Method)- waiting on org.apache.zookeeper.server.SessionTrackerImpl@296b6b0aat org.apache.zookeeper.server.SessionTrackerImpl.run(SessionTrackerImpl.java:147)"Reference Handler" Id=2 cpuUsage=0% WAITING on java.lang.ref.Reference$Lock@24d69c83at java.lang.Object.wait(Native Method)- waiting on java.lang.ref.Reference$Lock@24d69c83at java.lang.Object.wait(Object.java:502)at java.lang.ref.Reference.tryHandlePending(Reference.java:191)at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)
查看一个非守护进程id,它正在AQS处等待。
[arthas@7457]$ thread 47
"pool-2-thread-1" Id=47 WAITING on java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@3f1125b4at sun.misc.Unsafe.park(Native Method)- waiting on java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@3f1125b4at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at java.lang.Thread.run(Thread.java:748)Affect(row-cnt:0) cost in 32 ms.
3.3 jad
可以用来检查线上的发布代码是否是最新的。可以定位到具体类,或者具体方法。很方便.
[arthas@7457]$ jad javax.naming.NamingException initCause ## 类加载器
ClassLoader:
## 位置
Location:## 对应的方法
@Override
public Throwable initCause(Throwable throwable) {super.initCause(throwable);this.setRootCause(throwable);return this;
}Affect(row-cnt:1) cost in 167 ms.
[arthas@7457]$
3.4 mc redefine
编译类,并外部加载。
可以查看:https://alibaba.github.io/arthas/mc,https://alibaba.github.io/arthas/redefine
3.5 sc
查看jvm中加载的类的信息
[arthas@7457]$ help scUSAGE:sc [-c <value>] [-d] [-x <value>] [-f] [-h] [-E] class-patternSUMMARY:Search all the classes loaded by JVM EXAMPLES: sc -d org.apache.commons.lang.StringUtilssc -d org/apache/commons/lang/StringUtilssc -d *StringUtilssc -d -f org.apache.commons.lang.StringUtilssc -E org\\.apache\\.commons\\.lang\\.StringUtilsWIKI:https://alibaba.github.io/arthas/sc OPTIONS:-c, --classloader <value> The hash code of the special class's classLoader-d, --details Display the details of class-x, --expand <value> Expand level of object (0 by default)-f, --field Display all the member variables-h, --help this help-E, --regex Enable regular expression to match (wildcard matching by default)<class-pattern> Class name pattern, use either '.' or '/' as separator
例如查看java.util.Stack类信息
[arthas@7457]$ sc -d java.util.Stackclass-info java.util.Stackcode-sourcename java.util.StackisInterface falseisAnnotation falseisEnum falseisAnonymousClass falseisArray falseisLocalClass falseisMemberClass falseisPrimitive falseisSynthetic falsesimple-name Stackmodifier publicannotationinterfacessuper-class +-java.util.Vector+-java.util.AbstractList+-java.util.AbstractCollection+-java.lang.Objectclass-loaderclassLoaderHash null Affect(row-cnt:1) cost in 20 ms.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
分割线,这里之后的测试,是自己写了一个简单测试类,方便看效果
放出类代码。各个命令的用法,请看 hepl 。注意以下的几个方法只是测试、排查时用。用完请reset/shutdown。还原被增强的字节码信息。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
package com.chl.arthes;/*** 测试arthas的 sc,stack,track,monitor,watch等* @author chenhailong**/
public class TestArthas {public static void main(String[] args) {TestArthas ta = new TestArthas();for(int i = 0; i<1000; i++) {ta.first(ta);System.out.println("当前第"+i+"次");}}private void first(TestArthas ta) {try {Thread.sleep(1 * 1000l);} catch (InterruptedException e) {e.printStackTrace();}ta.second(ta);}private void second(TestArthas ta) {try {Thread.sleep(2 * 1000l);} catch (InterruptedException e) {e.printStackTrace();}ta.third(ta);}private void third(TestArthas ta) {try {Thread.sleep(3 * 1000l);} catch (InterruptedException e) {e.printStackTrace();}four(1);}private static void four(int i) {try {Thread.sleep(4 * 1000l);} catch (InterruptedException e) {e.printStackTrace();}}
}
3.6 stack
如下:指定不同方法,显示的调用栈信息不同。
## main方法
[arthas@10031]$ stack com.chl.arthes.TestArthas main
Press Q or Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 62 ms.## first方法
[arthas@10031]$ stack com.chl.arthes.TestArthas first
Press Q or Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 14 ms.
ts=2020-04-08 14:15:21;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@4e25154f@com.chl.arthes.TestArthas.first()at com.chl.arthes.TestArthas.main(TestArthas.java:-1)## four方法
[arthas@10031]$ stack com.chl.arthes.TestArthas four
Press Q or Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 12 ms.
ts=2020-04-08 14:16:01;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@4e25154f@com.chl.arthes.TestArthas.four()at com.chl.arthes.TestArthas.third(TestArthas.java:42)at com.chl.arthes.TestArthas.second(TestArthas.java:33)at com.chl.arthes.TestArthas.first(TestArthas.java:24)at com.chl.arthes.TestArthas.main(TestArthas.java:-1)
3.7 Track
通过观察可以发现,只是检测出当前指定的方法内所调用的子方法执行时间,子方法的调用链条相关信息并没有。但是可以指定多个方法
[arthas@10031]$ trace com.chl.arthes.TestArthas second
Press Q or Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 15 ms.
`---ts=2020-04-08 14:21:32;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@4e25154f`---[9007.022122ms] com.chl.arthes.TestArthas:second()`---[7006.119983ms] com.chl.arthes.TestArthas:third() #33## 指定多个方法
[arthas@10031]$ trace -E com.chl.arthes.TestArthas main|first|second|third|four
Press Q or Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:5) cost in 63 ms.
`---ts=2020-04-08 14:24:07;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@4e25154f`---[4002.333079ms] com.chl.arthes.TestArthas:four()`---ts=2020-04-08 14:24:11;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@4e25154f`---[10012.039629ms] com.chl.arthes.TestArthas:first()`---[9009.76905ms] com.chl.arthes.TestArthas:second() #24`---[9009.523887ms] com.chl.arthes.TestArthas:second()`---[7006.258283ms] com.chl.arthes.TestArthas:third() #33`---[7005.978271ms] com.chl.arthes.TestArthas:third()`---[4001.466666ms] com.chl.arthes.TestArthas:four() #42`---[4001.241582ms] com.chl.arthes.TestArthas:four()
3.8 watch
可以监控指定类、指定方法的参数|返回值|异常|方法等。可以用来查看一些环境的方法调用入参、出参信息等。也能排查部分特定类型的异常。
[arthas@10031]$ watch com.chl.arthes.TestArthas first params
Press Q or Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 18 ms.
ts=2020-04-08 14:27:12; [cost=10011.513947ms] result=@Object[][@TestArthas[com.chl.arthes.TestArthas@5197848c],
]
[arthas@10031]$ watch com.chl.arthes.TestArthas four params
Press Q or Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 17 ms.
ts=2020-04-08 14:27:32; [cost=4001.605734ms] result=@Object[][@Integer[1],
]
3.9 monitor
监控方法的使用情况(调用次数、执行时间、失败率等),也还挺有用的。
[arthas@10031]$ monitor com.chl.arthes.TestArthas first
Press Q or Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 36 ms.timestamp class method total success fail avg-rt(ms) fail-rate
----------------------------------------------------------------------------------------------------- 2020-04-08 14:34:25 com.chl.arthes.TestArthas first 5 5 0 10008.78 0.00% timestamp class method total success fail avg-rt(ms) fail-rate
----------------------------------------------------------------------------------------------------- 2020-04-08 14:35:25 com.chl.arthes.TestArthas first 6 6 0 10014.58 0.00% timestamp class method total success fail avg-rt(ms) fail-rate
----------------------------------------------------------------------------------------------------- 2020-04-08 14:36:25 com.chl.arthes.TestArthas first 6 6 0 10013.24 0.00%
3.10 tt
记录方法调用信息,支持事后查看方法调用的参数,返回值,抛出的异常等信息,仿佛穿越时空隧道回到调用现场一般。感觉像moitor的展开版。记录每一次的调用情况。用处看情况而定吧。
[arthas@10031]$ tt -t com.chl.arthes.TestArthas first
Press Q or Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 32 ms.INDEX TIMESTAMP COST(ms) IS-RET IS-EXP OBJECT CLASS METHOD
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------1000 2020-04-08 14:41:23 10012.799803 true false 0x5197848c TestArthas first 1001 2020-04-08 14:41:33 10008.528389 true false 0x5197848c TestArthas first 1002 2020-04-08 14:41:43 10008.465553 true false 0x5197848c TestArthas first 1003 2020-04-08 14:41:53 10018.298319 true false 0x5197848c TestArthas first 1004 2020-04-08 14:42:03 10018.851135 true false 0x5197848c TestArthas first 1005 2020-04-08 14:42:13 10009.51691 true false 0x5197848c TestArthas first
4.0 火焰图
[arthas@10031]$ profiler start
Started [cpu] profiling.... 等待一会后执行
[arthas@10031]$ profiler stop
profiler output file: /Users/chenhailong/eclipse-workspace2/MutilThreadTest/arthas-output/20200408-144819.svg
OK
生成的文件通过浏览器 http://127.0.0.1:8563/arthas-output/20200408-144819.svg 可访问。
火焰图,百度自己搜索吧。现在我还不清楚怎么看。
Arthas试用感受
挺好用的一工具,但是局限于现在试用的场景,但也还是能做很多分析的。以后在碰到实际问题的时候多多利用。熟能生巧,也是一个不错的助手。就到这里。
小尾巴:deathearth
官网:https://github.com/alibaba/arthas/blob/master/README_CN.md
这篇关于Arthas,一个JAVA项目分析/诊断工具在mac上的试用记录(命令详细示例)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!