arthas基本使用记录
最近刚开始在工作正在的接触开发模块,前期公司的要求是先学习日常使用的工具后期学习java8新特性、框架以及产品中使用到的新技术。所有规定自己每天写博客来记录自己日常学习的输出,方便以后的复习巩固,也供大家参考。如有错误之处,麻烦大家指出!
快速入门:常用命令
1、arthas启动
java -jar arthas-boot.jar
如果端口被占用,也可以通过以下命令换成另外一个端口号执行
java -jar arthas-boot.jar --telnet-port 9998 --http-port -1
2、常用命令
dashboard
dashboard仪表盘 --显示当前系统的实施数据面板
输入dashboard,按enter,会展示当前进程的信息,按Ctrl+c 可以中断执行
第一部分是显示JVM中运行的所有线程:所在线程组,优先级,线程的状态,CPU的占用率,是否是后台进程等
第二部分显示的JVM内存的使用情况
第三部分是操作系统的一些信息和java版本号
thread
查看当前JVM的线程堆栈信息
thread -n 线程id :指定最忙的前N个线程并打印堆栈
例如:展示当前最忙的前3个线程并打印堆栈信息
thread -n 3
thread -b :找出当前阻塞其他线程的线程
thread -i 线程id:指定CPU占比统计的采样间隔,单位为毫秒
例如:指定采样时间间隔,每隔1000ms采样,显示最占时间的3个线程
thread -i 1000 -n 3
查看处于等待状态的线程
thread --state WAITTING
通过thread命令来获取到arthas-demo进程的Main Class
获取到arthas-demo进程的Main Class
thread 1 会打印线程ID 1的栈,通常是main函数的线程
JVM
显示当前JVM的信息
COUNT:JVM当前活跃的线程数
DAEMON-COUNT:JVM当前活跃的守护线程数
PEAK-COUNT:从JVM启动开始曾经活着的最大线程数
STARTED-COUNT:从JVM启动开始总共启动过的线程次数
DEADLOCK-COUNT:JVM当前死锁的线程数
MAX-FILE-DESCRIPTOR-COUNT:JVM进程最大可以打开的文件描述符数
OPEN-FILE-DESCRIPTOR-COUNT:JVM当前打开的文件描述符数
sysprop
查看和修改JVM的系统属性
例如:查看所有属性
sysprop
查看单个属性
sysprop java.version
修改单个属性
sysprop user.country CN
通过jad来反编译Main Class
jad demo.MathGame
demo --包名
MathGame --类名
watch
通过watch命令来查看demo.MathGame#primeFactors 函数的返回值
watch demo.MathGame primeFactors returnObj
demo --包名
MathGame --类名
primeFactors --监视的方法
returnObj --监视的返回值
退出arthas
如果只是退出当前的连接,可以使用quit或者exit命令。Attach到目标进程上的arthas还会继续运行,端口会保持开放,下次连接时可以直接连接上。
如果想完全退出arthas,可以使用stop命令
基础命令
session : 显示当前连接的会话ID
reset : 重置arthas增强的类
version : 显示当前arthas的版本号
quit : 退出当前的会话
stop : 结束arthas服务器,退出所有的会话
keymap : 显示所有的快捷键
3、JVM相关命令
sysenv
查看当前JVM的环境属性
例如:查看所有环境变量
sysenv
查看单个环境变量
sysenv USER
vmoption
查看VM诊断相关的参数
例如:查看所有的选项
vmoption
查看指定的选项
vmoption PrintGCDetails
更新指定的选项
vmoption PrintGCDetails true
getstatic
通过getstatic命令可以方便的查看类的静态属性
语法:getstatic 类名 属性名
ognl
执行ognl表达式
ognl表达式语法参考官网:https://commons.apache.org/proper/commons-ognl/language-guide.html
例如:调用静态函数
ognl ‘@java.lang.System@out.println(“hello”)’
获取静态类的静态字段
ognl ‘@demo.MathGame@random’
获取静态类的静态字段
ognl ‘@demo.MathGame@random’
执行多行表达式,赋值给临时变量,返回一个List
ognl ‘#value1=@System@getProperty(“java.home”),#value2=@System@getProperty(“java.runtime.name”),{#value1,#value2}’
4、class/classloader相关命令
Search Class
Search Method
sc
查看JVM已加载的类信息,Search Class的简写,搜索出所有已加载到JVM中的Class信息。sc默认开启了子类匹配功能,也就是说所有当前类的子类也会被搜索出来,想要精确的匹配,可以打开 options disable-sub-class true开关
sm
查看已加载类的方法信息,Search Method的简写,这个命令能搜索出所有已经加载了Class信息的方法信息。sm命令只能看到由当前类所申明的方法
例如:显示String类加载的方法
sm java.lang.String
jad
把字节码文件反编译成代码
作用:反编译指定已加载类源码
jad命令将JVM中实际运行的class的byte code反编译成java代码,便于理解业务逻辑;
在Arthas Console上,反编译出来的源码是带语法高亮的
例如:编译java.lang.String
jad java.lang.String
反编译时只显示源代码,默认情况下,反编译结果里会带有ClassLoader信息,通过–source-only选项,可以只打印源代码。方便和mc/redefine命令结合使用
jad --source-only demo.MathGame
反编译指定的函数
jad demo.MathGame main
mc
mc把内存中把源代码编译成字节码文件
作用:内存编译器,编译.java文件生成.class
在内存中编译hello.java为hello.class
mc /root/Hello.java
可以通过-d命令指定输出目录
mc -d /root /root/Hello.java
redefine
把新生成的字节码文件在内存中执行
作用:加载外部的.class文件,redefine到JVM里
注意:redefine后的原来的类不能恢复,redefine有可能失败(比如增加类新的field)
reset命令对redefine的类无效。如果想重置,需要redefine原始的字节码
redefine命令和jad / watch / trace / monitor / tt 等命令会冲突。执行完redefine之后,如果再执行上面提到的命令,则会把redefine的字节码重置
redefine的限制:不允许新增加field/method;正在跑的函数,没有退出不能失效。
综合示例:
结合jad、mc、redefind 范例
1、使用jad反编译demo.MathGame输出到 /root/MathGame.java
jad --source-only demo.MathGame > /root/MathGame.java
2、按上面的代码编辑完毕以后,使用mc内存中对新的代码编译
mc /root/MathGame.java -d /root
3、使用redefine命令加载新的字节码
redefine /root/demo/MathGame.class
其实大家最开始入行程序员或者接触新技术时,看这些文字资料基本都有点摸不着方向,也不知道这项技术能够解决实际生产过程中的什么问题,不知道会有什么样的结果。所以建议大家能够先在网上看看相关技术的视屏,文字资料作为自己学习新技术的提升回顾,或者是学习产物的输出。
最后希望大家都能很好的拥抱技术。以后我基本学习的东西都会以博客的方式进行输出,希望大家多多支持!