Arthas 使用(一) —— 基础命令
Arthas 简介
Arthas 是 Alibaba 开源的 Java 诊断工具,根据官方介绍,它提供了如下工功能:

官方文档地址: https://alibaba.github.io/arthas/
github 源码地址: https://github.com/alibaba/arthas
Arthas 安装
启动 Arthas
# 下载 arthas
curl -O https://alibaba.github.io/arthas/arthas-boot.jar
# 通过如下命令启动
java -jar arthas-boot.jar

选择进程 id 按下回车,就可以连接到对应的 java 应用,首次启动会下载一些文件到 "C:/Users/${user}/.arthas/lib/3.2.0/arthas" 目录

arthas 启动支持多个参数,可以使用 -h 查看

EXAMPLES:
java -jar arthas-boot.jar <pid>
java -jar arthas-boot.jar --target-ip 0.0.0.0
java -jar arthas-boot.jar --telnet-port 9999 --http-port -1
java -jar arthas-boot.jar --tunnel-server 'ws://192.168.10.11:7777/ws'
java -jar arthas-boot.jar --tunnel-server 'ws://192.168.10.11:7777/ws'
--agent-id bvDOe8XbTM2pQWjF4cfw
java -jar arthas-boot.jar --stat-url 'http://192.168.10.11:8080/api/stat'
java -jar arthas-boot.jar -c 'sysprop; thread' <pid>
java -jar arthas-boot.jar -f batch.as <pid>
java -jar arthas-boot.jar --use-version 3.2.0
java -jar arthas-boot.jar --versions
java -jar arthas-boot.jar --session-timeout 3600
java -jar arthas-boot.jar --attach-only
java -jar arthas-boot.jar --repo-mirror aliyun --use-http
WIKI:
https://alibaba.github.io/arthas
help
arthas 连接成功后,使用 help 可以看到提供的一些命令

每个命令可以使用 -h 参数查看帮助信息,里面有EXAMPLES和WIKI链接

webconsole
arthas 启动后,可以通过浏览器进行访问,地址 http://localhost:8563/

退出
如果只是退出当前的连接,可以用quit或者exit命令。Attach到目标进程上的arthas还会继续运行,端口会保持开放,下次连接时可以直接连接上。
如果想完全退出arthas,可以执行stop命令。
Arthas 命令
dashboard
查看面板信息,主要包含cpu 内存使用信息,可以按 Ctrl+C 或者 输入 q 退出

数据说明
- ID: Java级别的线程ID,注意这个ID不能跟jstack中的nativeID一一对应
- NAME: 线程名
- GROUP: 线程组名
- PRIORITY: 线程优先级, 1~10之间的数字,越大表示优先级越高
- STATE: 线程的状态
- CPU%: 线程消耗的cpu占比,采样100ms,将所有线程在这100ms内的cpu使用量求和,再算出每个线程的cpu使用占比。
- TIME: 线程运行总时间,数据格式为
分:秒 - INTERRUPTED: 线程当前的中断位状态
- DAEMON: 是否是daemon线程
thread
查看线程使用情况
# 查看所有线程信息
thread
# 查看具体线程的栈,查看线程ID 16的栈:
thread 16
# 查看CPU使用率top n线程的栈
thread -n 3
# 查看5秒内的CPU使用率top n线程栈
thread -n 3 -i 5000
# 查找线程是否有阻塞
thread -b

sysprop
查看当前JVM的系统属性,支持 pipeline
sysprop # 查询所有属性
sysprop key # 查看key对应的属性
sysprop key value # 修改属性值
sysprop | grep java # 查询包含java的属性
sysprop | wc -l # 统计数量

sysenv
查看当前JVM的环境属性
用法和 sysprop 类似,不支持修改

logger
查看logger信息,更新logger level
logger # 查看所有logger对象信息
logger -n [name] # 查看名为name的logger信息
logger -c [classloader] -n [name] -l ERROR # 修改名为name的logger级别为ERROR,需指定类加载器

sc
查看JVM已加载的类信息
sc -d org.apache.commons.lang.StringUtils # 查看StringUtils详细信息
sc -d org/apache/commons/lang/StringUtils # 查看StringUtils详细信息
sc -d *StringUtils # 查看StringUtils,根据*匹配
sc -d -f org.apache.commons.lang.StringUtils # 查看类及成员变量信息,f要配合d使用才有效

sm
查看已加载类的方法信息,用法和 sc 类似
sm java.lang.String # 查看String的所有方法
sm -d org.apache.commons.lang.StringUtils # 查看String方法详情
sm -d org/apache/commons/lang/StringUtils # 查看String方法详情
sm *StringUtils * # 查看String方法,根据*匹配

dump
dump 已加载类的 bytecode 到特定目录
dump java.lang.String # dump java.lang.String.class文件
dump java.lang.* # dump 批量dump
dump -d /tmp/output java.lang.String # dump到指定目录
dump org/apache/commons/lang/StringUtils # dump,支持目录格式
dump *StringUtils # dump,根据*匹配

jad
反编译指定已加载类的源码
jad java.lang.String # 反编译String类
jad java.lang.String toString # 反编译指定方法
jad --source-only java.lang.String # 反编绎时只显示源代码
jad -c 39eb305e org/apache/log4j/Logger # 反编译指定classloader

classloader
查看classloader的继承树,urls,类加载信息
classloader # 列出所有classLoader
classloader -t # 树形结构列出所有classLoader
classloader -l # 统计每个classLoader加载类数量
classloader -c 327a647b # 查看具体的classLoader
classloader -a # 列出所有加载的类
classloader -c 659e0bfd --load demo.MathGame # 使用指定classLoader加载类

mc
编译.java文件生成.class
mc /tmp/Test.java # 编译Test.java
mc -c 327a647b /tmp/Test.java # 使用 -c 指定classLoader
mc -d /tmp/output /tmp/ClassA.java /tmp/ClassB.java # 使用 -d 指定输出目录
redefine
加载外部的.class文件
redefine命令和jad/watch/trace/monitor/tt等命令会冲突。执行完redefine之后,如果再执行上面提到的命令,则会把redefine的字节码重置。 原因是jdk本身redefine和Retransform是不同的机制,同时使用两种机制来更新字节码,只有最后修改的会生效。
redefine /tmp/Test.class # 加载类
redefine -c 327a647b /tmp/Test.class /tmp/Test\$Inner.class # 指定classLoader
通常结合 jad/mc 使用
- jad命令反编译,然后可以用其它编译器,比如vim来修改源码
- mc命令来内存编译修改过的代码
- 用redefine命令加载新的字节码
redefine的限制
- 不允许新增加 field/method
- 正在跑的函数,没有退出不能生效
watch
方法执行数据观测
# 方法调用前观察,可以是非静态方法
watch -b org.apache.commons.lang.StringUtils isBlank params
# 在方法结束之后(正常返回和异常返回)观察
watch -f org.apache.commons.lang.StringUtils isBlank returnObj
# 指定输出结果的属性遍历深度,2
watch org.apache.commons.lang.StringUtils isBlank '{params, target, returnObj}' -x 2
# 耗时100ms时输出
watch *StringUtils isBlank params '#cost>100'
@RestController
public class UserController {
@GetMapping("/user/{id}")
public User getUser(@PathVariable Integer id) {
if (null == id) {
throw new IllegalArgumentException("id can not be null");
}
if (id < 1) {
throw new IllegalArgumentException("id must be greater than 1");
}
return new User(id, "zhangsan");
}
}
使用如下 watch 命令,然后访问 http://localhost:9090/user/10
watch com.soulballad.usage.arthasdemo.web.UserController getUser "{params,target,returnObj}" -x 2 -b -s -n 2

- 参数里
-n 2,表示只执行两次 - 输出结果中,第一次输出的是方法调用前的观察结果,第二次输出的是方法返回后的表达式的结果
- 结果的输出顺序和事件发生的先后顺序一致,和命令中
-s -b的顺序无关
trace
方法内部调用路径,并输出方法路径上的每个节点上耗时
trace org.apache.commons.lang.StringUtils isBlank # 查看isBlank方法调用路径及耗时
trace *StringUtils isBlank # 使用*匹配
trace *StringUtils isBlank '#cost>100' # 过滤只输出耗时大于100ms的记录
# 正则表达式,支持多个路径记录
trace -E com.test.ClassA|org.test.ClassB method1|method2|method3
trace demo.MathGame run -n 5 # 只执行5次
trace demo.MathGame run --skipJDKMethod false # 不跳过jdk中方法,默认为true

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

支持条件过滤和 ognl 表达式
tt
方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
tt -t *StringUtils isEmpty # 记录isEmpty方法调用
tt -t *StringUtils isEmpty params[0].length==1 # 解决方法重载
tt -l # 查看所有记录
tt -i 1000 # 查询index为1000的记录详情
tt -i 1000 -p # 根据index重新触发调用
tt -i 1000 -p --replay-times 3 --replay-interval 3000 # 指定触发间隔和次数
tt --delete-all # 删除所有记录

ognl
执行ognl表达式
ognl '@java.lang.System@out.println("hello")' # 调用静态函数
ognl -x 2 '@Singleton@getInstance()' # 2层
ognl '@Demo@staticFiled' # 输出静态变量值
# 把java.home和java.runtime.name的系统属性放到一个集合中输出
ognl '#value1=@System@getProperty("java.home"), #value2=@System@getProperty("java.runtime.name"), {#value1, #value2}'
ognl -c 5d113a51 '@com.taobao.arthas.core.GlobalOptions@isDump' # 输出false
Arthas 使用(一) —— 基础命令的更多相关文章
- 学习 git基础命令
缘起 年后到了新公司,由于个人意愿到了一个海外的项目组,除了自己从Java技术栈转了C#技术栈外,很多技术都是第一次使用,学习压力不小啊. 自己也就先从常用的技术开始学起,比如C#,AngularJS ...
- Linux安全基础:shell及一些基础命令
1.什么是shell?Shell是用户和Linux操作系统之间的接口.Linux中有多种shell,其中缺省使用的是Bash. 2.shell的分类(1)bash bash shell 是 Bourn ...
- LINUX二十个基础命令
LINUX二十个基础命令 一. useradd命令 1.命令格式: useradd 选项 用户名 2.命令功能: 添加新的用户账号 3.常用参数: -c comment 指定一段注释性描述.-d 目录 ...
- Docker - Docker基础命令及使用
Docker Docker - 官网 Docker - Hub GitHub - Docker Docker中文社区 Docker基础命令 Docker 查看帮助信息:docker --help 查看 ...
- vim基础命令
2015-06-04 by komilevim基础命令 打开一个文件 vim index.php 几种模式说明Normal Mode也就是最一般的普通模式,默认进入vim之后,处于这种模式.Inser ...
- linux学习之——基础命令
Linux体系基础命令: Linux是一个命令行组成的操作体系!精华在命令行,岂论图形界面成长到什么水平这个原理是不会变的,Linux命令有许多壮大的效用:从简单的磁盘操作.文件存取.到举办庞大的多媒 ...
- windows下使用redis,Redis入门使用,Redis基础命令
windows下使用redis,Redis入门使用,Redis基础命令 >>>>>>>>>>>>>>>> ...
- Linux系统基础命令
这是看itercast的学习笔记 Linux系统基础命令 日期时间 命令date用以查看.设置当前系统时间:格式化显示时间: +%Y--%m--%d 命令hwclock(clock)用以显示硬件时钟时 ...
- 第四节,Linux基础命令
第四节,Linux基础命令 命令是系统操作员对系统传入的指令,传入指令后回车,系统接收到指令做出相应的行为 1.查看用户位于系统什么位置 [pmd]检查操作用户位于系统的什么位置 命令 ...
随机推荐
- Web前端三大主流框架是什么?Web前端前景与就业形势
近十年以来,IT行业发展火热,衍生了很多新职业,例如UI设计师.开发工程师.软件测试工程师等等,在众多备受瞩目的新生职业中,Web前端工程师是其中的一员.那么Web前端三大主流框架是什么呢? 一.We ...
- php +go关键字实现协程
来源: https://studygolang.com/articles/17631?fr=sidebar 今天在知乎浏览时忽然发现了一个有趣的东西,php竟然可以实现协程的实现,而且还是通过go关键 ...
- webpack4 图片加载
图片处理(file-loader) 引用时出现的问题 在js中引入图片并添加到页面 let img = new Image(); img.src = './logo.png' document.bod ...
- 20199308《Linux内核原理与分析》第十二周作业
一.实验简介 竞态条件是指多个线程同时访问或者操作同一块数据,运行的结果依赖于不同线程访问数据的顺序.如果一个拥有root权限的程序存在竞态条件漏洞的话,攻击者可以通过运行一个平行线程与漏洞程序竞争, ...
- VC++ QT 数组的初始化
数组有时会初始化为0. 但加了一个 QThread 的派生类对象之后,数组就不再被初始化为0了. 所以对于数组还是要手动初始化,否则可能产生无法预料的现象.
- Windows系统自带的ODBC Data Sources的配置及使用
一直不明白ODBC是个什么东东,虽然一次次碰到,却从没用过,看Wikipedia上的描述,可以访问各种数据库.Excel.CSV等,可以剥离数据库和操作系统依赖,简直神乎其神.不过这样的描述太抽象概括 ...
- jdbc批量插入数据
//插入很多书(批量插入用法) public void insertBooks(List<Book> book) { final List<Book> tempBook=b ...
- CreateDIBSection和位图结构
2019独角兽企业重金招聘Python工程师标准>>> 理解分辨率 我们常说的屏幕分辨率为640×480,刷新频率为70Hz,意思是说每行要扫描640个象素,一共有480行,每秒重复 ...
- cookie ,session 和localStorage的区别详解
2019独角兽企业重金招聘Python工程师标准>>> cookie ,session 和localStorage的区别详解 博客分类: js 当你在浏览网站的时候,WEB 服务器会 ...
- 实战-MySQL定时增量备份(2)
概要 引言 增量备份 恢复增量备份 定时备份 引言 在产品上线之后,我们的数据是相当重要的,容不得半点闪失,应该做好万全的准备,搞不好哪一天被黑客入侵或者恶意删除,那就 gg 了.所以要对我们的线上数 ...