Arthas 是阿里开源的Java诊断工具。安装在系统所在服务器,有着强大的能力,是一个开发运维神器。主要功能:
- 在线热替换代码/代码增强
- 全局视角的性能分析
- 查看方法执行情况,帮助跟踪偶现的bug
官方网站资料 https://arthas.aliyun.com/doc/
容器中使用
根据官方手册,在容器中下载curl下载该工具并简单使用
- 执行该程序的用户需要和目标进程具有相同的权限。比如以admin用户来执行:sudo su admin && java -jar arthas-boot.jar 或 sudo -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 打印更多参数信息
常用命令
详细见官方手册命令
version:查看当前Arthas版本
help:arthas命令行帮助
dashboard:系统监控台信息
thread :查看线程信息
配置dockerfile
在构建镜像时候,可以把arthus注入到dockerfile中,方便容器排障
排障举例
排查内存占用大的地方
行memory命令以获取当前Java虚拟机(JVM)的整体内存使用状态,包括堆内存、非堆内存以及各细分区域的使用详情。这一步对于识别内存是否泄漏及大致位置至关重要。
分析关键词解释
- 观察heap区域,特别是g1_old_gen的增长情况,因为长期存活的对象通常在此积累。
- 注意nonheap区域,特别是metaspace的增长,过大的类元数据可能导致问题。
- 检查是否有特定的codeheap区域异常增长,这可能意味着即时编译的代码占用过多内存。
定位内存泄漏
- 连续监控:多次执行memory命令并记录结果,关注任何持续增长的内存区域。
- 堆转储分析:使用heapdump命令生成堆的快照,随后利用如Eclipse MAT等工具深入分析增长的对象类型和引用链路。
解释
通过对比不同时间点的memory命令输出,可以发现内存泄漏的趋势。而heapdump生成的堆转储文件能够提供泄露对象的详细信息,包括它们的数量、大小及引用关系,这对于定位具体泄漏源非常关键。
排查HTTP请求返回401
通常是被权限管理的Filter拦截了,那么到底是哪个Filter处理了这个请求,返回了401?
可以在调用树的最深层,找到AdminFilterConfig$AdminFilter返回了401
分析线程卡住
此命令会列出当前阻塞其他线程的线程信息,包括线程ID、状态以及它持有的锁。例如,输出可能会显示某个线程处于TIMED_WAITING状态,并指出该线程持有一个锁,同时阻塞了其他线程。
关注锁定对象:注意输出中被- locked标记的行,这表示该线程持有的锁。如果该锁导致了其他线程的阻塞,这里会有明确提示。
查看调用栈:调用栈信息可以帮助理解该线程在阻塞前正在执行的操作,这对于诊断问题至关重要。