Arthas

news2024/10/2 22:16:28

Arthas

概述

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

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

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

1. 启动math-game

curl -O https://arthas.aliyun.com/math-game.jar
java -jar math-game.jar

math-game是一个简单的程序,每隔一秒生成一个随机数,再执行质因数分解,并打印出分解结果。

2. 启动arthas

在命令行下面执行(使用和目标进程一致的用户启动,否则可能attach失败):

curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
  • 执行该程序的用户需要和目标进程具有相同的权限。比如以admin用户来执行:sudo su admin && java -jar arthas-boot.jarsudo -u admin -EH java -jar arthas-boot.jar
  • 如果attach不上目标进程,可以查看~/logs/arthas/ 目录下的日志。
  • 如果下载速度比较慢,可以使用aliyun的镜像:java -jar arthas-boot.jar --repo-mirror aliyun --use-http
  • java -jar arthas-boot.jar -h 打印更多参数信息。

选择应用java进程:

$ $ java -jar arthas-boot.jar
* [1]: 35542
  [2]: 71560 math-game.jar

math-game进程是第2个,则输入2,再输入回车/enter。Arthas会attach到目标进程上,并输出日志:

需要注意的是 arthas在连接了一个java程序之后,需要断开才能连接第二个,不让会报如下错

[ERROR] The telnet port 3658 is used by process 149108 instead of target process 120344, you will connect to an unexpected process.
[ERROR] 1. Try to restart arthas-boot, select process 149108, shutdown it first with running the 'stop' command.
[ERROR] 2. Or try to stop the existing arthas instance: java -jar arthas-client.jar 127.0.0.1 3658 -c "stop"
[ERROR] 3. Or try to use different telnet port, for example: java -jar arthas-boot.jar --telnet-port 9998 --http-port -1

常用指令

1、dashboard

使用dashboard指令可以看到当前进程的信息。

在这里插入图片描述

2、thread

使用thread指令可以看到所有线程信息,指定具体的pid可以看到线程的具体信息。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OAx3o1w5-1657012075654)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646534164532.png)]

-n参数:可以查看最繁忙的三个线程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FSg2Anq6-1657012075655)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646544581915.png)]

-b参数:查看死锁的线程,同时可以看到谁被谁锁住了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XpSNYhcJ-1657012075655)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646544952512.png)]

-i参数:指定采样间隔

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l4BCbzRv-1657012075657)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646545113541.png)]

3、jad

使用这条指令可以反编译class文件,参数为包名+类名

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mDGNudTG-1657012075657)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646534528057.png)]

除了可以直接反编译class文件外,还可以仅仅反编译方法[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dlKI8nq2-1657012075658)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646550781837.png)]

4、watch

可以查看方法的入参、返回值、抛出异常、运行时间与运行时间点等信息,第一个参数为包名.类名,第二个参数为方法名,第三个参数为ognl表达式,指为返回值。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EaS9SHfx-1657012075659)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646534791507.png)]

使用ognl表达式查看入参与出参

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xpyJP5kN-1657012075660)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646572058389.png)]

-b参数为方法执行前,获取入参

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CnJDccN8-1657012075661)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646576128092.png)]

target获取所有属性

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pwGuSvuD-1657012075662)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646576335373.png)]

-s,后置参数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gQMK0Ki1-1657012075662)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646576703750.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EtmkrtaT-1657012075663)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646577322345.png)]

5、pwd

显示当前工作目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v8FwWn7j-1657012075664)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646535255865.png)]

6、session

查看当前会话的信息,第一个为java进程的id,第二个为arthas追踪的会话信息。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-on4xW5mA-1657012075664)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646536213988.png)]

7、reset

还原被arthas增强过的类,arthas服务端关闭时会自动重置所有的增强类。

8、trace

追踪指定方法的执行信息,包括线程信息,优先级,类加载器,执行时间

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tlS1hFDZ-1657012075665)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646536643436.png)]

还可以看到执行指定方法的耗时,红色时间代表最耗时的部分。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9hzS3mvR-1657012075666)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646577732304.png)]

输出耗时大于0.5毫秒的方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cJkk9v5q-1657012075666)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646577958079.png)]

9、keymap

查看所有的快捷键

10、jvm

显示jvm所有的基本信息,如操作系统、线程信息、文件信息。

11、sysprop

查看和修改jvm属性

查看:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qvUmVCpA-1657012075667)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646545709574.png)]

修改的话,查看命令后面跟上值就可以了。

12、sysenv

查看系统属性

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AR8yD16f-1657012075667)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646546129353.png)]

13、vmoption

查看和修改虚拟机相关参数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dF4OtVZR-1657012075668)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646546347554.png)]

14、getstatic

查看类的静态属性。

15、ognl

ognl表达式: OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。

使用ognl调用方法:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Re8m2N2b-1657012075668)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646547132769.png)]

使用ognl获取属性,效果同getstatic

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R4LUc07t-1657012075669)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646547222170.png)]

除此之外还可以生成对象

16、sc

搜索类的信息,-d参数可以获取详细信息,-df还可以获取属性的信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5HlhA2tP-1657012075670)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646550255819.png)]

17、sm

获取方法信息 -d获取详细信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wZvcNM8D-1657012075671)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646550415960.png)]

18、mc

编译java文件为class文件

19、redefine

将新增或修改后的文件动态的加载到jvm中,注意:正在运行的class文件不能redefine。

如下案例为动态修改在运行的class文件,并让他运行。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R5R1iQgp-1657012075672)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646551175122.png)]

20、dump

将已加载的字节码文件保存到特定目录。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TxkHdGWh-1657012075672)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646551856111.png)]

21、classloader

这个命令可以将所有的类加载器统计出来,并展示各自统计的类个数,也可以指定类加载器去获取resource,打印出resource的路径,对于ResourceNotFoundException比较有用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rul1xOEF-1657012075673)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646552403971.png)]

-l参数,展示父类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yeDLis8h-1657012075674)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646552489211.png)]

-c参数 可以找到类加载所在的包

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xn2hdg8m-1657012075674)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646552744692.png)]

-r参数可以通过类加载器找到指定文件在哪个目录下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gTVUsQsm-1657012075675)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646552984718.png)]

-load 可以指定类加载器加载指定class文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HCbtbY1D-1657012075676)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646553197239.png)]

22、monitor

监控指定类方法的执行情况

一下为每隔5秒返回一次demo.MathGame类的primeFactors方法的执行情况

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D9EDAa0Z-1657012075677)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646553918223.png)]

23、stack

输出当前方法被调用的调用路径

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BYhGwn0z-1657012075677)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646578188238.png)]

过滤方法第一个入参小于0,执行两次的调用路径[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m5OFInQL-1657012075678)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\1646578342916.png)]

24、tt

watch 虽然很方便和灵活,但需要提前想清楚观察表达式的拼写,这对排查问题而言要求太高,因为很多时候我们并不清楚问题出自于何方,只能靠蛛丝马迹进行猜测。

tt -t参数可以看到方法的具体执行时间,耗时,是否成功,并且后期还可以看到执行的结果。

-t

tt 命令有很多个主参数,-t 就是其中之一。这个参数的表明希望记录下类 *Testprint 方法的每次执行情况

  • 条件表达式

    不知道大家是否有在使用过程中遇到以下困惑

    • Arthas 似乎很难区分出重载的方法
    • 我只需要观察特定参数,但是 tt 却全部都给我记录了下来

    条件表达式也是用 OGNL 来编写,核心的判断对象依然是 Advice 对象。除了 tt 命令之外,watchtracestack 命令也都支持条件表达式。

  • 解决方法重载

    tt -t *Test print params.length==1

    通过制定参数个数的形式解决不同的方法签名,如果参数个数一样,你还可以这样写

    tt -t *Test print 'params[1] instanceof Integer'

  • 解决指定参数

    tt -t *Test print params[0].mobile=="13989838402"

25、option

全局开关

可以设置option

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TPDdEImw-1657012075678)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\image-20220313122053957.png)]

26、profiler

profiler 命令支持生成应用热点的火焰图。本质上是通过不断的采样,然后把收集到的采样结果生成火焰图。

启动profiler

$ profiler start
Started [cpu] profiling

默认情况下,生成的是cpu的火焰图,即event为cpu。可以用--event参数来指定。

获取已采集的sample的数量

$ profiler getSamples
23

查看profiler状态

$ profiler status
[cpu] profiling is running for 4 seconds

可以查看当前profiler在采样哪种event和采样时间。

停止profiler

生成html格式结果

默认情况下,结果文件是html格式,也可以用--format参数指定:

$ profiler stop --format html
profiler output file: /tmp/test/arthas-output/20211207-111550.html
OK

或者在--file参数里用文件名指名格式。比如--file /tmp/result.html

点击可以查看具体的结果:

_images/arthas-output-svg.jpg

含义:

$ profiler status
[cpu] profiling is running for 4 seconds


可以查看当前profiler在采样哪种`event`和采样时间。

## 停止profiler

### 生成html格式结果

默认情况下,结果文件是`html`格式,也可以用`--format`参数指定:

$ profiler stop --format html
profiler output file: /tmp/test/arthas-output/20211207-111550.html
OK


或者在`--file`参数里用文件名指名格式。比如`--file /tmp/result.html` 。

点击可以查看具体的结果:

[外链图片转存中...(img-6LFbVsP1-1657012075679)]

含义:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-To4j9g0u-1657012075680)(C:\Users\Ric\Desktop\每日总结\后端\arthas\Arthas\image-20220313123008638.png)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/584685.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无纸化、自动化、智能化|WMS系统升级你的仓储管理模式

随着物流行业的不断发展,现代仓储管理已经从传统的手工操作逐渐转向无纸化、自动化、智能化管理。WMS系统作为一种全新的仓储管理模式,正在逐步被企业所接受和运用。 什么是WMS系统? WMS系统全称为Warehouse Management System,即…

汇编寄存器之内存访问

1.内存中字的存储: 在CPU中用一个16位寄存器来存储一个字, 高8位存高字节,低8位存低字节 如AX寄存器存在一个字,那么AH存高字节,AL存低字节 在内存中存储字时是用两个连续的字节来存储字的, 这个字的低字节存在低单元,高字节存在高单元. 如下表示: 内存单元编号 单元中…

开发工程师-常用算法基本思想 -分类-时间复杂度与空间复杂度概述

文章目录 插入排序选择排序交换排序归并排序各种排序算法时间复杂度、空间复杂度以及稳定性分类 插入排序 1.基本思想:将一个数据插入到一个有序的数据列表,得到一个新的有序列表 2.分类:直接插入排序、希尔排序 选择排序 1.工作原理&…

机器学习基础知识之多模型性能对比评价方法

文章目录 1、交叉验证t检验2、Friedman检验与Nemenyi后续检验 在进行预测或分类对比实验时,通常需要比较两个或两个以上的模型性能,因此,下面将介绍两个常用的多模型性能对比评价方法,一种是交叉验证t检验,该方法主要用…

英语单词365-9

英语单词365-9 9.1 manipulate_哔哩哔哩_bilibili

网络安全就业会不会容易被淘汰?

先说结论:不会 作为一名资深的网络安全工程师,我的观点是网络安全是一个长期持续的领域,而不是一个很容易被淘汰的职业。可能会随着技术的进步和新的威胁的出现而有所改变,但作为一个专门从事网络安全领域的人员,我们…

SQL面试必备:100道高频考题解析

前言 在众多IT职场中,SQL技术一直是一个非常重要的技能点。如果你正在准备SQL相关的面试,那么这份“SQL面试 100 问”绝对是你不能错过的宝藏! 这份清单涵盖了100道高频考题,从基础知识到复杂应用都有所涉及,帮助你全…

数据结构·第3章【栈和队列】

栈 顺序栈 栈(Stack)是限定仅在表的一端进行插入或删除操作的线性表。通常称插入删除的一端为栈顶(top),另一端称为栈底(bottom)。 typedef struct{DataType data[StackSize];int top; }Se…

缩减虚拟机堆空间的方式,缓解32位cpu上虚拟内存地址空间限制导致的内存分配失败崩溃

缩减虚拟机堆空间的方式,缓解32位cpu上虚拟内存地址空间限制导致的内存分配失败崩溃 前言Matrix使用说明效果验证 前言 瑞芯微平台应用开发,目前RK3288芯片应用还是比较广泛(成本低),它是一个32位cpu,并且…

Halcon中的一些3D算子

一、记录一些Halcon里的关于3D的算子 1.read_object_model_3d 从文件读取一个3d模型 如下图,读的一个ply文件出来是个3d点云模型 2.visualize_object_model_3d 交互式展示3d模型 即上个算子读出来后,通过这个算子可以把3d模型显示出来旋转、平移&am…

SpringFramework 中CollectionUtils 工具类的使用

CollectionUtils是Spring框架中的一个工具类,提供了一系列对集合的操作方法。 import org.springframework.util.CollectionUtils;import java.util.*;public class CollectionUtilDemo {public static void main(String[] args) {//判断一个集合或Map是否为空&…

OWASP ZAP alerts

前提 使用OWASP ZAP对网站进行安全扫描,扫描后发现一些警告。 使用警告名称在百度进行搜索就能看到在OWASP ZAP网站上对应警告的解释。 可以在如下地址输入alert查询 https://www.zaproxy.org/docs/alerts/ Missing Anti-clickjacking Header 见https://www.zap…

SQL Server 2008R2安装图文教程(附SQL Server下载安装包)

SQL Server 2008R2 安装教程 演示系统:Windows server 2008R2 安装包:下载传送门 下载并解压安装包,找到解压的安装包,双击【setup.exe】 如果是你的服务器没有安装.NET Framework 3.5,那会弹出个提示框,…

CODEC 基础知识

 ASDOUT : ADC data output  DSDIN : DAC data input  LRCK : Left/Right data alignment clock  SCLK : Bit clock  MCLK 256 LRCK 或者 MCLK384 LRCK different audio data formats:  I2S …

公司新来了个拿18K出来的测试,让我见识到了什么叫真正的测试扛把子...

今天上班开早会就是新人见面仪式,听说来了个很厉害的大佬,年纪还不大,是上家公司离职过来的,薪资已经达到中高等水平,很多人都好奇不已,能拿到这个薪资应该人不简单,果然,自我介绍的…

如何编写快速高效的SQL查询(四)——优化特定类型的查询与样例

这一节,我们将介绍如何优化特定类型的查询。 本节介绍的多数优化技巧都和特定的版本有关,所以对于未来MySQL的版本未必适用。毫无疑问,某一天优化器自己也会实现这里列出的部分或者全部优化技巧。 优化COUNT()查询 COUNT()聚合函数&#xf…

Hive安装部署

1、Hive安装地址 ①Hive官网地址 Apache Hive ②文档查看地址 GettingStarted - Apache Hive - Apache Software Foundation ③下载地址 Index of /dist/hive ④github地址 GitHub - apache/hive: Apache Hive 2、 安装Hive 1)把apache-hive-3.1.3-bin.ta…

“AI换脸”诈骗背后,如何应对黑灰产使用手段?

目录 诈骗是如何发生的? AI换脸诈骗的操作防范 AI换脸的风险分析与技术防范 近日,警方通报了一起使用智能AI技术进行电信诈骗的案件。被骗者是福州市某科技公司法人代表郭先生,他通过微信视频接到自己好友的电话,对方佯装需要借…

帕累托改进和帕累托最优、卡尔多-希克斯改进

根据目标个数,分为单目标规划,以及多目标规划。多目标的规划是去找折中的解集合,既pareto最优解集合。对优化目标超过3个以上的,称之为超多目标优化问题。 帕累托改进描述的就是在没有人变得不好的前提下让有些人更好的过程。帕累…

GPT虚拟直播Demo系列(二)|无人直播间实现虚拟人回复粉丝

摘要 虚拟人和数字人是人工智能技术在现实生活中的具体应用,它们可以为人们的生活和工作带来便利和创新。在直播间场景里,虚拟人和数字人可用于直播主播、智能客服、营销推广等。接入GPT的虚拟人像是加了超强buff,具备更强大的自然语言处理能…