1.部署
先学会下载 (两个jar包)
建议放在一个文件夹里面 配合着 MAT 使用
curl -O https://arthas.aliyun.com/arthas-boot.jar
curl -O https://arthas.aliyun.com/math-game.jar
math-game是一个简单的程序,每隔一秒生成一个随机数,再执行质因数分解,并打印出分解结果。
执行该程序的用户需要和目标进程具有相同的权限。如果 attach 不上目标进程,可以查看~/logs/arthas/ 目录下的日志如果下载速度比较慢,可以使用 aliyun 的镜像:java -jar arthas-boot.jar --repo-mirror aliyun --use-httpjava -jar arthas-boot.jar -h 打印更多参数信息
ID: Java 级别的线程 ID,注意这个 ID 不能跟 jstack 中的 nativeID 一一对应。NAME: 线程名
GROUP: 线程组名
PRIORITY: 线程优先级, 1~10 之间的数字,越大表示优先级越高
STATE: 线程的状态
CPU%: 线程的 cpu 使用率。比如采样间隔 1000ms,某个线程的增量 cpu 时间为 100ms,则 cpu 使用率=100/1000=10%
DELTA_TIME: 上次采样之后线程运行增量 CPU 时间,数据格式为秒
TIME: 线程运行总 CPU 时间,数据格式为分:秒
INTERRUPTED: 线程当前的中断位状态
DAEMON: 是否是 daemon 线程
dashboard - 当前系统的实时数据面板
getstatic - 查看类的静态属性
heapdump - dump java heap, 类似 jmap 命令的 heap dump 功能
jvm - 查看当前 JVM 的信息
logger - 查看和修改 logger
mbean - 查看 Mbean 的信息
memory - 查看 JVM 的内存信息
ognl - 执行 ognl 表达式
perfcounter - 查看当前 JVM 的 Perf Counter 信息
sysenv - 查看 JVM 的环境变量
sysprop - 查看和修改 JVM 的系统属性
thread - 查看当前 JVM 的线程堆栈信息
vmoption - 查看和修改 JVM 里诊断相关的 option
vmtool - 从 jvm 里查询对象,执行 forceGc
运行
//又先后顺序
java -jar math-game.jar
//在运行
java -jar arthas-boot.jar
// xsell或者finadShell 开两个页面执行
2.生成报告
1. 什么是dump文件?
dump文件是一个进程或者系统在某一个给定的时间的快照。
dump文件是用来给驱动程序编写人员调试驱动程序用的,这种文件必须用专用工具软件打开。
dump文件中包含了程序运行的模块信息、线程信息、堆栈调用信息、异常信息等数据。
在服务器运行我们的Java程序时,是无法跟踪代码的,所以当发生线上事故时,dump文件就成了一个很关键的分析点。
2. 如何生成dump文件?
主动生成dump文件。首先要查找运行的Java程序的pid。
使用thread命令:
导出dump对象
dump java heap, 类似jmap命令的heap dump功能。
使用参考:
dump到指定文件:
[arthas@58205]$ heapdump /usr/local/docker/jvm/dump.hprof
Dumping heap to /tmp/dump.hprof...
Heap dump file created
只dump live对象:
[arthas@58205]$ heapdump --live /tmp/dump.hprof
Dumping heap to /tmp/dump.hprof...
Heap dump file created
dump到临时文件:
[arthas@58205]$ heapdump
Dumping heap to /var/folders/my/wy7c9w9j5732xbkcyt1mb4g40000gp/T/heapdump2019-09-03-16-385121018449645518991.hprof...
Heap dump file created
3.常用指令
1、dashboard 仪表板
第一部分是显示JVM中运行的所有线程:所在线程组,优先级,线程的状态,CPU的占用率,是否是后台进程等
第二部分显示的JVM内存的使用情况
第三部分是操作系统的一些信息和Java版本号
2、通过 thread 命令来获取线程信息
1、当没有参数时,显示所有线程的信息
thread
2、展示当前最忙的前3个线程并打印堆栈
thread -n 3
3、显示1号线程的运行堆栈
thread 1
4、找出当前阻塞其他线程的线程,有时候我们发现应用卡住了, 通常是由于某个线程拿住了某个锁, 并且其他线程都在等待这把锁造成的。 为了排查这类问题, arthas提供了thread -b, 一键找出那个罪魁祸首。
thread -b
5、指定采样时间间隔,每过1000毫秒采样,显示最占时间的3个线程
thread -i 1000 -n 3
6、查看处于等待状态的线程
thread --state WAITING
3、通过 jad 来反编译获取源码
1、编译java.lang.String
jad java.lang.String
2、反编绎时只显示源代码,默认情况下,反编译结果里会带有ClassLoader信息,通过–source-only选项,可以只打印源代码。方便和mc/redefine命令结合使用。
jad --source-only demo.MathGame
3、反编译指定的方法
jad demo.MathGame main
4、watch监视
watch demo.MathGame(监视的包名和类名) primeFactors(监视的方法) returnObj(监视的返回值)
5、退出arthas
如果只是退出当前的连接,可以用quit或者exit命令。Attach到目标进程上的arthas还会继续运行,端口会保持开放,下次连接时可以直接连接上。
如果想完全退出arthas,可以执行stop命令。
4、常用系统命令
1、help 查看命令帮助信息
2、cat 打印文件内容,和linux里的cat命令类似 注:汉字有乱码的问题 如果没有写路径,则显示当前目录下的文件
3、grep 匹配查找,和linux里的grep命令类似,但它只能用于管道命令
4、pwd 返回当前的工作目录,和linux命令类似
5、cls 清空当前屏幕区域
6、session 查看当前会话的信息
7、reset 重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类
8、version 输出当前目标 Java 进程所加载的 Arthas 版本号
9、history 打印命令历史
10、quit 退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
11、stop 关闭 Arthas 服务端,所有 Arthas 客户端全部退出
12、keymap Arthas快捷键列表及自定义快捷键
5、JVM相关命令
1、sysprop:查看和修改JVM的系统属性
# 查看所有属性
sysprop
# 查看单个属性,支持通过tab补全
sysprop java.version
# 修改单个属性
sysprop user.country
sysprop user.country CN
2、sysenv:查看当前JVM的环境属性
# 查看所有属性
sysenv
# 查看单个环境变量
sysenv USER
3、vmoption:查看,更新JVM诊断相关的参数
# 查看所有的选项
vmoption
# 查看指定的选项
vmoption PrintGCDetails
# 更新指定的选项
vmoption PrintGCDetails true
4、 getstatic:查看类的静态属性
getstatic 类名 属性名
5、ognl:可替代上面getstatic命令
# 调用静态函数
ognl '@java.lang.System@out.println("hello")'
# 获取静态类的静态字段
ognl '@demo.MathGame@random'
# 执行多行表达式,赋值给临时变量,返回一个List
ognl '#value1=@System@getProperty("java.home"), #value2=@System@getProperty("java.runtime.name"), {#value1, #value2}