Arthas,一个JAVA项目分析/诊断工具在mac上的试用记录(命令详细示例)

本文主要是介绍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/查看。如下图:

arthas浏览器访问

当我们在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上的试用记录(命令详细示例)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只