Arthas[阿尔萨斯]
Arthas开启
-- 查看需要查询内存数据的执行java程序的进程端口号
jps -ml
-- 下载
curl -O https://arthas.aliyun.com/arthas-boot.jar
-- 进入到了进程,可以开始查看内存数据了
java -jar arthas-boot.jar 端口号
Arthas命令
- dashboard
- heap dump
- thread
- jvm
- jad
- sc
- mc
- redefine
- trace
-- 可以查看当前系统的实时数据面板。可以查看到CPU、内存、GC、运行环境等信息。
dashboard
-- 会生成一个堆内存快照文件 heapdump.hprof 的文件
-- 类似jmap命令,线上别用!!!
heapdump
-- 查看当前JVM的线程信息
thread
-- 命令会打印出JVM的各种详细信息
jvm
-- 反编译代码
jad
jad --source-only com.service.Test > /tmp/Test.java
-- sc命令用于查看JVM已加载的类信息。该命令的完整名称是“Search-Class”
sc
-- 输出当前类的详细信息,包括类加载的原始文件来源、类的声明、加载的ClassLoader等详细信息
sc -d
-- 会显示Test类classLoader的Hash
sc -d com.logic.Test | grep classLoaderHash
sc -d *Test | grep classLoaderHash
-- 在JVM内存中编译Java源码为字节码
mc
-- 用classLoaderHash为6bc28484的classLoader编译Test.java,结果放在/tmp下
mc -c 6bc28484 /tmp/Test.java -d /tmp
-- redefine热更类
redefine /tmp/Test.class
-- 分析方法内部的调用路径,输出方法调用链路及其耗时
trace
输入 exit 或者 quit 命令可以退出Arthas当前session。执行 stop 命令彻底退出Arthas。
Arthas使用Ognl
ognl通过简单的表达式语法,可以访问对象的任意属性、调用对象的方法、遍历对象的结构图,并实现类型转换等功能。
-- 方法调用1
ognl '@com.etc.database.DataCenter@getSysData(@com.etc.entity.sys.TestSysData@class)'
-- 方法调用2
ognl '@com.etc.database.DataCenter@getSysData(@com.etc.entity.sys.TestSysData@class).getDataMap().get(10001).getRoleDataMap().get(1801982379342819833L).getRechargeIds().add(161001)'
Arthas热更类
热更类:自己上传类
-
把需要热更的类上传,编译后的文件
-
使用redefine热更
redefine /tmp/ReqUseItemHandler.class
linux下:
windows下:
热更类:直接反编译出类
# 反编译
$ jad --source-only com.jingmai.video.live.order.service.impl.ApplerPayServiceImpl > /tmp/ApplerPayServiceImpl.java
# 修改文件(不在arthas 的控制台!!!!,新开一个会话,在centos的控制台操作)
$ vim /tmp/ApplerPayServiceImpl.java (在java文件中加入逻辑)
# 查找被修改的java类的加载的 ClassLoader
$ sc -d *ApplerPayServiceImpl | grep classLoaderHash
classLoaderHash 6bc28484
# 编译
$ mc -c 6bc28484 /tmp/ApplerPayServiceImpl.java -d /tmp
# 热更新
$ redefine /tmp/com/jingmai/video/live/order/service/ApplerPayServiceImpl.class
redefine success, size: 1