Arthas 排查JAVA应用问题 —— 筑梦之路

简介

Arthas 是阿里开源的一款 Java 应用诊断工具,可以在线排查问题,动态跟踪 Java 代码,以及实时监控 JVM 状态。

官方网站:arthas

快速入门

1. 下载

wget https://arthas.aliyun.com/arthas-boot.jar

2. 运行

需要在运行了java程序的环境运行

java -jar arthas-boot.jar

程序会显示出系统中所有正在运行的 Java 进程,Arthas 为每个进程分配了一个序号

[INFO] JAVA_HOME: C:\Program Files\Java\jdk1.8.0_351\jre
[INFO] arthas-boot version: 3.7.1
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 9400 .\target\demo-0.0.1-SNAPSHOT.jar[2]: 13964 org.eclipse.equinox.launcher_1.6.500.v20230717-2134.jar[3]: 6796 org.springframework.ide.vscode.boot.app.BootLanguageServerBootApp

从这个列表中找到出问题的那个 Java 进程,并输入相应的序号,比如这里我输入 1,然后按下回车,Arthas 就会自动下载完整的包,并 Attach 到目标进程,输出如下:

[INFO] Start download arthas from remote server: https://arthas.aliyun.com/download/3.7.1?mirror=aliyun
[INFO] Download arthas success.
[INFO] arthas home: C:\Users\aneasystone\.arthas\lib\3.7.1\arthas
[INFO] Try to attach process 9400
[INFO] Attach process 9400 success.
[INFO] arthas-client connect 127.0.0.1 3658,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---.  /  O  \ |  .--. ''--.  .--'|  '--'  | /  O  \ '   .-' 
|  .-.  ||  '--'.'   |  |   |  .--.  ||  .-.  |`.  `-. 
|  | |  ||  |\  \    |  |   |  |  |  ||  | |  |.-'    |
`--' `--'`--' '--'   `--'   `--'  `--'`--' `--'`-----' wiki       https://arthas.aliyun.com/doc
tutorials  https://arthas.aliyun.com/doc/arthas-tutorials.html
version    3.7.1
main_class
pid        9400                                                                 
time       2023-12-06 07:16:31[arthas@9400]$

3. 查看所有命令

[arthas@9400]$ helpNAME         DESCRIPTIONhelp         Display Arthas Helpauth         Authenticates the current sessionkeymap       Display all the available keymap for the specified connection.sc           Search all the classes loaded by JVMsm           Search the method of classes loaded by JVMclassloader  Show classloader infojad          Decompile classgetstatic    Show the static field of a classmonitor      Monitor method execution statistics, e.g. total/success/failure count, average rt, fail rate, etc.stack        Display the stack trace for the specified class and methodthread       Display thread info, thread stacktrace        Trace the execution time of specified method invocation.watch        Display the input/output parameter, return object, and thrown exception of specified method invocationtt           Time Tunneljvm          Display the target JVM informationmemory       Display jvm memory info.perfcounter  Display the perf counter information.ognl         Execute ognl expression.mc           Memory compiler, compiles java files into bytecode and class files in memory.redefine     Redefine classes. @see Instrumentation#redefineClasses(ClassDefinition...)retransform  Retransform classes. @see Instrumentation#retransformClasses(Class...)dashboard    Overview of target jvm's thread, memory, gc, vm, tomcat info.dump         Dump class byte array from JVMheapdump     Heap dumpoptions      View and change various Arthas optionscls          Clear the screenreset        Reset all the enhanced classesversion      Display Arthas versionsession      Display current session informationsysprop      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 levelhistory      Display command historycat          Concatenate and print filesbase64       Encode and decode using Base64 representationecho         write arguments to the standard outputpwd          Return working directory namembean        Display the mbean informationgrep         grep command for pipes.tee          tee command for pipes.profiler     Async Profiler. https://github.com/jvm-profiling-tools/async-profilervmtool       jvm toolstop         Stop/Shutdown Arthas server and exit the console.
  • 与 JVM 相关的命令

  • 与类加载、类、方法相关的命令

  • 统计和观测命令

  • 类 Linux 命令

  • 其他命令

 这是主要的几类命令

 与 JVM 相关的命令

这些命令主要与 JVM 相关,用于查看或修改 JVM 的相关属性,查看 JVM 线程、内存、CPU、GC 等信息:

  • jvm - 查看当前 JVM 的信息;

  • sysenv - 查看 JVM 的环境变量;

  • sysprop - 查看 JVM 的系统属性;

  • vmoption - 查看或修改 JVM 诊断相关的参数;

  • memory - 查看 JVM 的内存信息;

  • heapdump - 将 Java 进程的堆快照导出到某个文件中,方便我们对堆内存进行分析;

  • thread - 查看所有线程的信息,包括线程名称、线程组、优先级、线程状态、CPU 使用率、堆栈信息等;

  • dashboard - 查看当前系统的实时数据面板,包括了线程、内存、GC 和 Runtime 等信息;可以把它看成是 threadmemoryjvmsysenvsysprop 几个命令的综合体;

  • perfcounter - 查看当前 JVM 的 Perf Counter 信息;

  • logger - 查看应用日志信息,支持动态更新日志级别;

  • mbean - 查看或实时监控 Mbean 的信息;

  • vmtool - 利用 JVMTI 接口,实现查询内存对象,强制 GC 等功能;

与类加载、类、方法相关的命令

 这些命令主要与类加载、类或方法相关,比如在 JVM 中搜索类或类的方法,查看类的静态属性,编译或反编译,对类进行热更新等:

  • classloader - 查看 JVM 中所有的 Classloader 信息;

  • dump - 将指定类导出成 .class 字节码文件;

  • jad - 将指定类反编译成 Java 源码;

  • mc - 内存编译器,将 Java 源码编译成 .class 字节码文件;

  • redefine / retransform - 这两个命令都可以对已加载的类进行热更新,但是 redefine 和 jad / watch / trace / monitor / tt 等命令会冲突,而且 redefine 后的原来的类不能恢复,所以推荐使用 retransform 命令,关于 JDK 中 Redefine 和 Retransform 机制的区别可以参考 这里;

  • sc - Search Class,搜索 JVM 中的类;

  • sm - Search Method,搜索 JVM 中的类的方法;

  • getstatic - 查看类的静态属性;

  • ognl - 执行 ognl 表达式;ognl 非常灵活,可以实现很多功能,比如上面的查看或修改系统属性,查看类的静态属性都可以通过 ognl 实现;

统计和观测

 这些命令可以对类方法的执行情况进行统计和监控,是排查线上问题的利器:

  • monitor - 对给定的类方法进行监控,统计其调用次数,调用耗时以及成功率等;

  • stack - 查看一个方法的执行调用堆栈;

  • trace - 对给定的类方法进行监控,输出该方法的调用耗时,和 monitor 的区别在于,它还能跟踪一级方法的调用链路和耗时,帮助快速定位性能问题;

  • watch - 观测指定方法的执行数据,包括方法的入参、返回值、抛出的异常等;

  • tt - 和 watch 命令一样,tt 也可以观测指定方法的执行数据,但 tt 是将每次的执行情况都记录下来,然后再针对每次调用进行排查和分析,所以叫做 Time Tunnel;

  • reset - 上面这些与统计观测相关的命令都是通过 字节码增强技术 来实现的,会在指定类的方法中插入一些切面代码,因此在生产环境诊断结束后,记得执行 reset 命令重置增强过的类(或执行 stop 命令);

  • profiler - 使用 async-profiler 对应用采样,并将采样结果生成火焰图;

  • jfr - 动态开启关闭 JFR 记录,生成的 jfr 文件可以通过 JDK Mission Control 进行分析;

Arthas 命令与 JDK 工具的对比 

Arthas 命令JDK 工具对比
syspropjinfo -sysprops都可以查看 JVM 的系统属性,但是 sysprop 比 jinfo 强的是,它还能修改系统属性
vmoptionjinfo -flag都可以查看 JVM 参数,但是 vmoption 只显示诊断相关的参数,比如 HeapDumpOnOutOfMemoryErrorPrintGC 等
memoryjmap -heap都可以查看 JVM 的内存信息,但是 memory 以表格形式显示,方便用户阅读
heapdumpjmap -dump都可以导出进程的堆内存,只是它在使用上更加简洁
threadjstack都可以列出 JVM 的所有线程,但是 thread 以表格形式显示,方便用户阅读,而且增加了 CPU 使用率的功能,可以方便我们快速找出当前最忙的线程
perfcounterjcmd PerfCounter.print都可以查看 JVM 进程的性能统计信息
classloaderjmap -clstats都可以查看 JVM 的 Classloader 统计信息,但是 classloader 命令还支持以树的形式查看,另外它还支持查看每个 Classloader 实际的 URL,通过 Classloader 查找资源等
jfrjcmd JFR.start都可以开启或关闭 JFR 记录,并生成的 jfr 文件

 类 Linux 命令

除了上面那些用于问题诊断的命令,Arthas 还提供了一些类 Linux 命令,方便我们在 Arthas 终端中使用,比如:

  • base64 - 执行 base64 编码和解码;

  • cat - 打印文件内容;

  • cls - 清空当前屏幕区域;

  • echo - 打印参数;

  • grep - 使用字符串或正则表达式搜索文本,并输出匹配的行;

  • history - 输出历史命令;

  • pwd - 输出当前的工作目录;

  • tee - 从 stdin 读取数据,并同时输出到 stdout 和文件;

  • wc - 暂时只支持 wc -l,统计输出的行数;

此外,Arthas 还支持在后台运行任务,仿照 Linux 中的相关命令,我们可以使用 & 在后台运行任务,使用 jobs 列出所有后台任务,使用 Ctrl + Z 暂停任务,使用 bg 和 fg 将暂停的任务转到后台或前台继续运行,使用 kill 终止任务。具体内容可以参考 Arthas 后台异步任务。

 其他命令

还有一些与 Arthas 本身相关的命令,比如查看 Arthas 的版本号、配置、会话等信息:

  • version - 查看 Arthas 版本号;

  • options - 查看或修改 Arthas 全局配置;

  • keymap - 查看当前所有绑定的快捷键,可以通过 ~/.arthas/conf/inputrc 文件自定义快捷键;

  • session - 查看当前会话信息;

  • auth - 验证当前会话;

  • quit - 退出当前 Arthas 客户端,其他 Arthas 客户端不受影响;

  • stop - 关闭 Arthas 服务端,所有 Arthas 客户端全部退出;这个命令会重置掉所有的增强类(除了 redefine 的类);

问题排查思路

 使用 watch 监听方法出入参和异常

使用 logger 动态更新日志级别

使用 ognl 查看系统属性和应用配置

使用 jad/sc/retransform 热更新代码

其他使用场景

Arthas 的使用非常灵活,有时候甚至还会有一些意想不到的功能,除了上面这些使用场景,Arthas 的 Issues 中还收集了一些 用户案例,其中有几个案例对我印象很深,非常有启发性,可供参考。

  • 使用 stack 命令定位 System.exit/System.gc 的调用来源:https://github.com/alibaba/arthas/issues/20

  • 使用 sc 和 jad 排查 NoSuchMethodError 问题:https://github.com/alibaba/arthas/issues/160

  • 使用 redefine 修改 StringBuilder.toString() 定位未知的日志来源:https://github.com/alibaba/arthas/issues/263

  • 使用 trace javax.servlet.Servlet/Filter 排查 Spring Boot 应用 404/401 问题:https://github.com/alibaba/arthas/issues/429

  • 使用 tt 定位 Java 应用 CPU 负载过高问题:https://github.com/alibaba/arthas/issues/1202

  • 使用 profiler 做复杂链路分析,排查性能问题:https://github.com/alibaba/arthas/issues/1416

  • 使用 trace 命令将接口性能优化十倍:https://github.com/alibaba/arthas/issues/1892

参考资料

 

  • Arthas 文档:https://arthas.aliyun.com/doc/

  • OGNL 参考文档:https://commons.apache.org/proper/commons-ognl/language-guide.html

  • Arthas 在线教程 - Killercoda:https://killercoda.com/arthas/course/arthas-tutorials-cn

  • redefine VS. retransform:https://lsieun.github.io/java-agent/s01ch03/redefine-vs-retransform.html

  • Alibaba Arthas实践--获取到Spring Context,然后为所欲为:https://github.com/alibaba/arthas/issues/482

  • Arthas 用户案例:https://github.com/alibaba/arthas/issues?q=label%3Auser-case

  • 使用 SkyWalking & Arthas 优化微服务性能:https://github.com/alibaba/arthas/issues/1653

使用 Arthas 排查线上问题 

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

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

相关文章

【细说Java内部类】

系列文章目录 例如:第一章 Python 机器学习入门之pandas的使用 文章目录 一、为什么需要内部类? 1.内部类的作用 2.内部类的使用场景 二、内部类的分类 1.成员内部类(实例内部类) 2.静态内部类 3.局部内部类 4.匿名内部类 总结 前…

ES如何提高准确率之【term-centric】

提高准确率的方法有很多,但是要在提高准确率的同时保证召回率往往比较困难,本文只介绍一种比较常见的情况。 问题场景 我们经常搜索内容,往往不止针对某个字段进行搜索,比如:标题、内容,往往都是一起搜索…

【卡塔尔世界杯数据可视化与新闻展示】

卡塔尔世界杯数据可视化与新闻展示 前言数据获取与处理可视化页面搭建功能实现新闻信息显示详情查看登录注册评论信息管理 创新点结语 前言 随着卡塔尔世界杯的临近,对于足球爱好者来说,对比赛的数据分析和新闻报道将成为关注的焦点。本文将介绍如何使用…

openmediavault debian linux安装配置企业私有网盘(三 )——raid5与btrfs文件系统无损原数据扩容

一、适用环境 1、企业自有物理专业服务器,一些敏感数据不外流时,使用openmediavault自建NAS系统; 2、在虚拟化环境中自建NAS系统,用于内网办公,或出差外网办公时,企业内的文件共享; 3、虚拟化环…

jmeter配置使用(mac)

前言 这篇文件就是一个笔记,非mac用户不用看了,我这是换了mac,要用jmeter的倒腾。 一、下载 二、使用步骤 1.解压 tgz格式的直接用tar命令就行 tar -zxvf 包名2.启动 一种是进入解压包的bin目录启动 这种方式启动的就是命令框不能关闭&am…

正则表达式详解

什么是正则表达式 正则表达式,又称规则表达式,通常被用来检索、替换那些符合某个模式(规则)的文本。 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个"规则字符串…

小区生活污水处理需要哪些设备和工艺

在小区生活中,污水处理是一个非常重要的环节,它关乎到环境的保护和居民的生活质量。因此,了解小区生活污水处理所需要的设备和工艺是至关重要的。 首先,在小区生活污水处理中,需要用到的设备包括污水收集系统、初级沉淀…

【数据结构】——排序算法简答题模板

目录 一、内排序和外排序二、排序算法的稳定性三、插入排序(一)直接插入排序的步骤(二)直接插入排序的稳定性(三)折半插入排序的步骤(四)希尔排序的步骤 四、交换排序(一…

多微信聚合聊天:一款简便的管理工具帮你摆脱微信繁琐之困!

在这个信息飞速传递的时代,微信已经成为了人们不可或缺的通信工具之一。然而,由于个人、工作等各种原因,我们可能会拥有多个微信号,而每天切换不同的账号进行聊天,无疑是一项繁琐的任务。 近日,我一位好友向…

互联网加竞赛 python+opencv+机器学习车牌识别

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于机器学习的车牌识别系统 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:4分工作量:4分创新点:3分 该项目较为新颖,适…

算法:程序员的数学读书笔记

目录 ​0的故事 ​一、按位计数法 二、不使用按位计数法的罗马数字 三、十进制转二进制​​​​​​​ ​四、0所起到的作用​​​​​​​ 逻辑 一、为何逻辑如此重要 二、兼顾完整性和排他性 三、逻辑 四、德摩根定律 五、真值表 六、文氏图 七、卡诺图 八、逻…

CorsInterceptor解决跨域问题

注解的方式 CrossOrigin(origins "http://localhost:8081", allowCredentials "true") 拦截器的方式 package com.rbynode.rbyaipro.interceptor;import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servl…

vector——OJ题

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、只出现一次的数字1、题目讲解2、思路讲解3、代码实现 二、杨辉三角1、题目讲解2、思路讲解…

前端没有死,前端开发框架:Bootstrap可以说一骑绝尘

再认识前端开发框架Bootstrap 当下最流行的前端开发框架Bootstrap,可大大简化网站开发过程,从而深受广大开发者的喜欢。本文总结了Bootstrap之所以广泛流传的11大原因。如果你还没有使用Twitter Bootstrap,建议你去了解一下。我也是最近才有所发现的,不过有更好的消息,在…

用postman进行web端自动化测试

前言 概括说一下,web接口自动化测试就是模拟人的操作来进行功能自动化,主要用来跑通业务流程。 主要有两种请求方式:post和get,get请求一般用来查看网页信息;post请求一般用来更改请求参数,查看结果是否正…

数据结构-迷宫问题

文章目录 1、题目描述2、题目分析3、代码实现 1、题目描述 题目链接:迷宫问题 、 注意不能斜着走! 2、题目分析 (1)0为可以走,1不能走且只有唯一一条通路 (2)我们可以通过判断上下左右来确定…

vue 在for循环中设置ref并获取$refs

一、单循环动态设置ref 1.设置&#xff1a;【:ref“‘XXX’ index”】XXX -->自定义ref的名字 2.获取&#xff1a;let ref eval(‘this.$refs.XXX’ index)[0] 3.示例&#xff1a; 代码如下所示 <template><div class"ref_test"><div v-fo…

PropertyUtils详解

PropertyUtils详解 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 解密Java神器&#xff1a;深入PropertyUtils的奇妙世界 在Java的丰富工具箱中&#xff0c;Pro…

两线制(V/F,I/F)频率脉冲信号转换器

两线制(V/F,I/F)频率脉冲信号转换器 型号&#xff1a;JSD TAF-1021S V/F,I/F频率脉冲信号转换器 型号&#xff1a;JSD TAF-1001S 高端型 型号&#xff1a;JSD TAF-1001D 经济型&#xff0c;价格优惠 新款V/F,I/F频率脉冲信号转换器属升级款&#xff0c;产品从性能&#xf…

邮政快递查询,邮政快递单号查询,根据更新量筛选出需要的单号

批量查询邮政快递单号的物流信息&#xff0c;并根据物流更新量将需要的单号筛选出来。 所需工具&#xff1a; 一个【快递批量查询高手】软件 邮政快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;第一次使用的伙伴记得先注册&…