深入理解JVM《Arthas - 阿里开源Java诊断神器》

简介: Arthas是阿里巴巴开源的Java诊断利器,无需重启应用即可动态追踪JVM运行状态。支持实时监控、线程分析、方法追踪、类反编译、热更新及火焰图生成,集众多工具之大成,助力开发者高效定位线上问题。

Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。它最大的优势在于无需修改代码、无需重启应用,即可动态跟踪、诊断线上问题,仿佛给了开发者一台能够透视运行中JVM的“显微镜”和“手术刀”。

核心特性与价值

  1. 动态诊断: attach到正在运行的JVM进程,实时查看运行状态,动态修改日志级别,甚至热修复代码。
  2. 功能强大:集成了jstack, jmap, jstat, jad, grep等众多命令行工具的功能,并提供了更强大的增强。
  3. 开箱即用:只需一个jar包,无需任何前置安装和配置。
  4. 交互式体验:提供丰富的命令行交互界面和Tab自动补全,体验极佳。

安装与快速入门

安装

# 直接下载jar包
curl -O https://arthas.aliyun.com/arthas-boot.jar
# 或者使用全量包
curl -O https://arthas.aliyun.com/arthas-boot.jar && java -jar arthas-boot.jar -h

启动与连接

java -jar arthas-boot.jar
# 输出示例:会列出当前机器上所有的Java进程,输入序号即可连接。
[INFO] arthas-boot version: 3.6.7
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 1234 com.example.Application
  [2]: 5678 org.apache.catalina.startup.Bootstrap
# 输入 '1',连接到PID为1234的进程。

连接成功后,你将进入Arthas的命令行交互界面。输入 help 可以查看所有命令。

核心命令详解与实战场景

Arthas命令繁多,以下按功能分类介绍最核心、最常用的命令。

1. 系统概览与实时监控

  • dashboard系统实时监控面板,这是Arthas最常用的命令之一。
  • 功能:在一个界面内综合显示线程列表内存各分区(堆、非堆)使用情况GC统计操作系统负载等信息。
  • 实战:快速了解应用的整体健康状况。按 q 退出,按 c 继续刷新。ctrl+c 完全退出。
  • 操作:直接输入 dashboard 即可。

2. 线程问题诊断

  • thread查看线程信息,功能远超 jstack。
  • thread:列出所有线程及其状态。
  • thread <id>:查看指定线程的详细堆栈信息。
  • thread -n 3:显示当前最忙的(CPU占用率最高的)3个线程。
  • thread -bthread --block一键检测死锁!这是杀手级功能,会直接打印出哪些线程持有了哪些锁,并导致了死锁。
  • thread -i 1000:统计最近1000ms内,每个线程的CPU使用时间。
  • watch方法执行数据观测
  • 功能:观察指定方法的调用情况,能查看入参返回值抛出异常,甚至方法内的成员变量
  • 语法watch 全限定类名 方法名 "{params, returnObj, throwExp}" -x 3
  • params:参数列表
  • returnObj:返回值
  • throwExp:异常
  • -x 3:指定输出属性的遍历深度(避免显示过长)
  • 实战示例
# 观察Demo类的echo方法,打印其入参和返回值,深度为2
watch com.example.Demo echo "{params, returnObj}" -x 2
# 观察方法执行耗时
watch com.example.Service * '{params, returnObj, #cost}' -x 2
  • trace方法内部调用路径追踪与耗时分析
  • 功能:追踪方法内部的所有子调用,并统计每个节点的耗时,非常适合定位性能瓶颈。
  • 实战示例
# 追踪Test类的run方法,并过滤掉耗时小于10ms的调用
trace com.example.Test run '#cost > 10'

3. 类与代码操作

  • jad反编译指定已加载的类
  • 功能:动态查看JVM中加载的类的字节码反编译后的Java代码。无需找源码,即可确认代码逻辑。
  • 实战示例
jad com.example.service.UserService # 反编译只显示源代码,不显示其他信息 
jad --source-only com.example.service.UserService
  • mc / redefine内存编译与热更新类
  • 功能mc (Memory Compiler) 将.java文件编译成.class字节码。redefine 将编译好的字节码加载到JVM中,替换掉原有的类定义。
  • 警告有风险的操作,限制很多(不能修改方法签名、不能增删字段等),主要用于紧急线上bug修复。
  • 流程示例
  • 在本地修改UserService.java的一个方法体。
  • mc UserService.java -d /tmp 编译到 /tmp 目录。
  • redefine /tmp/UserService.class 热更新到JVM。

4. 高级表达式与调用

  • ognl执行OGNL表达式
  • 功能:这是一个极其强大的功能,可以执行任意OGNL表达式,从而查看甚至修改应用内的静态变量、调用静态方法等。
  • 实战示例
# 获取Spring应用的ApplicationContext(假设是单例静态变量)
ognl '@com.example.demo.ApplicationContextProvider@applicationContext'
# 获取Spring容器中所有Bean的名字
ognl '#ctx=@com.example.demo.ApplicationContextProvider@applicationContext, #ctx.getBeanDefinitionNames()'
# 修改某个静态配置开关(例如Logger的level)
ognl '@org.apache.logging.log4j.core.config.Configurator@setRootLevel(@org.apache.logging.log4j.Level@ERROR)'

5. 性能分析与监控

  • profiler集成async-profiler进行采样生成火焰图
  • 功能:无需额外安装,直接使用Arthas即可生成CPU或内存分配火焰图,直观定位性能热点。
  • 实战示例
profiler start # 开始采样
profiler stop --format html --file /tmp/flamegraph.html # 停止并生成HTML格式的CPU火焰图
profiler start -e alloc # 开始采样内存分配
profiler stop --file /tmp/alloc-flamegraph.html # 停止并生成内存分配火焰图

6. 专项命令

  • monitor方法执行监控
  • 功能:定时统计方法的执行次数、成功次数、失败次数、平均RT等。
  • 示例monitor -c 5 com.example.Service checkUser 每5秒统计一次checkUser方法的调用情况。
  • stack输出方法调用的调用路径
  • 功能:快速查看某个方法被调用的完整堆栈路径。常用于定位“谁调用了这个方法”。
  • 示例stack com.example.Utils expensiveMethod

最佳实践与注意事项

  1. 生产环境慎用:虽然Arthas很安全,但 watchtrace 等命令会对性能有一定影响(尤其是在高频率调用的方法上)。建议在预发或测试环境充分练习,在生产环境使用时明确目标,并尽量使用过滤条件减少输出和开销。
  2. 权限:运行Arthas的用户需要和目标Java进程是同一用户。
  3. 防火墙:如果诊断远程服务器,确保服务器的防火墙允许Arthas的连接(默认端口3658)。
  4. 退出:使用 stop 命令退出Arthas,这会断开与目标JVM的连接,但不会影响目标JVM的正常运行。

总结

Arthas将JVM诊断的能力提升到了一个新的高度。它不再是简单的“只读”监控,而是提供了强大的“交互”和“干预”能力。从查看线程堆栈、反编译代码,到方法调用追踪、动态热更新,Arthas几乎涵盖了线上问题排查的所有场景。掌握Arthas,是每一位追求高效排查问题的Java开发者的必修课。

相关文章
|
Arthas 监控 Java
Java 诊断利器 Arthas使用
Java 诊断利器 Arthas使用
3286 0
|
22天前
|
人工智能 运维 算法
AI来了,运维不慌:教你用人工智能把团队管理提速三倍!
AI来了,运维不慌:教你用人工智能把团队管理提速三倍!
215 8
|
1月前
|
Arthas 数据可视化 Java
深入理解JVM《火焰图:性能分析的终极可视化利器》
火焰图是Brendan Gregg发明的性能分析利器,将复杂调用栈可视化为“火焰”状图形,直观展示函数耗时与调用关系。通过宽度识别热点函数,结合async-profiler或Arthas工具生成,助力快速定位CPU、内存等性能瓶颈,提升优化效率。
|
16天前
|
存储 监控 安全
什么是技术架构、数据架构、业务架构、应用架构、产品架构和项目架构?
为何技术设计完善,项目仍推进艰难?根源在于架构认知缺失。本文系统解析业务、数据、应用、技术、产品、项目六大核心架构,揭示数字化建设的底层逻辑,助力跨部门协作与高效交付,实现技术价值最大化。
|
27天前
|
存储 Kubernetes Perl
Kubernetes中Pod的常用命令及镜像拉取策略详解
理解Kubernetes中Pod的操作和配置策略,对于保障应用的顺利部署和运行至关重要。通过掌握这些命令和策略,你可以更有效地管理和优化你的Kubernetes集群。
355 17
|
1月前
|
Java Linux Apache
在CentOS服务器上编译并部署NiFi源码
部署Apache NiFi在CentOS上是一个涉及细节的过程,需要注意Java环境、源码编译、配置调整等多个方面。遵循上述步骤,可以在CentOS服务器上成功部署和配置Apache NiFi,从而高效地处理和分发数据。
129 17
|
1月前
|
存储 缓存 安全
c盘清理软件推荐
c盘清理软件推荐
|
2月前
|
Arthas 运维 监控
一次线上CPU飙高排查实录:从Arthas到JVM调优的深入之旅
本文记录了一次线上Java应用CPU使用率异常升高的故障排查过程。通过使用阿里巴巴开源工具Arthas,快速定位到问题根源:日志切面中存在性能缺陷的正则表达式在处理超长字符串时引发“回溯爆炸”,导致CPU资源耗尽。文中详细介绍了排查步骤、问题分析及解决方案,包括利用Arthas进行实时监控、线程分析、方法监控和在线热更新修复。最后总结了排查经验与技术启示,强调工具掌握、性能意识与防御式编程的重要性。
361 0
|
6月前
|
Arthas 监控 Java
Arthas thread(查看当前JVM的线程堆栈信息)
Arthas thread(查看当前JVM的线程堆栈信息)
1048 10
|
6月前
|
Arthas 存储 监控
Arthas heapdump(dump java heap, 类似 jmap 命令的 heap dump 功能)
Arthas heapdump(dump java heap, 类似 jmap 命令的 heap dump 功能)
380 8