这里 是 阿尔萨斯
的故事
冰封王座的主角, 封面上的人物:
Alibaba开源的Java诊断工具, 以命令行的方式监控跟踪线上程序运行过程,解决一些棘手的问题。
这里 是 Arthas
的官方文档, 本文简单记录一些常用的手段。
wget https://alibaba.github.io/arthas/arthas-boot.jar
wget https://arthas.gitee.io/arthas-boot.jar
java -jar arthas-boot.jar
java -jar arthas-boot.jar --repo-mirror aliyun --use-http
查看帮助
清屏
当前会话
重置增强类, shutdown的时候也会被reset
关闭服务端
关闭当前客户端
历史命令
版本
自定义快捷键
查看当前线程信息,查看线程的堆栈
doc
查看jvm的信息
doc
查看和修改当前JVM的系统属性
doc
查看jvm的环境变量
doc
查看静态变量
doc
执行ognl 表达式
doc
查看JVM已加载的类信息
doc
查看JVM已加载的方法信息
doc
反编译已加载的指定类
doc
内存编译
doc
替换已经加载的class文件
doc
方法监控
doc
方法执行数据监控
doc
这里要注意方法入参和方法出参的区别,有可能在中间被修改导致前后不一致,除了 -b 事件点 params 代表方法入参外,其余事件都代表方法出参
下面是核心变量
public class Advice { private final ClassLoader loader; private final Class<?> clazz; private final ArthasMethod method; private final Object target; private final Object[] params; private final Object returnObj; private final Throwable throwExp; private final boolean isBefore; private final boolean isThrow; private final boolean isReturn; // getter/setter }
方法内部调用路径,并输出方法路径上的每个节点上耗时
doc
输出当前方法被调用的调用路径
doc
方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
doc
OGNL 是 Object-Graph Navigation Language 的缩写,从语言角度来说:它是一个功能强大的表达式语言,用来获取和设置 java 对象的属性 , 它旨在提供一个更高抽象度语法来对 java 对象图进行导航
package ongltest; import ognl.Ognl; import ognl.OgnlException; import java.util.HashMap; import java.util.Map; public class Main { public static void main(String[] args) throws OgnlException { Student student = TotalFactory.genStudent1(); Map<String, Object> map = new HashMap<>(); map.put("student1", student); /** * <pre> * 1.ognl 缺省的上下文只有root和context * 2.#root 来显示的指定使用root还是使用context * * </pre> */ // 获取student的name System.out.println(Ognl.getValue("name", student)); System.out.println(Ognl.getValue("#root.name", student)); /** * <pre> * ognl可以写成链式的 * </pre> */ // 获取student的name的大写 System.out.println(Ognl.getValue("name.toUpperCase()", student)); /** * <pre> * ognl 可以显示的指定使用context or root * </pre> */ // 设置一个上下文 System.out.println(Ognl.getValue("#context.student1.name", map, student)); System.out.println(Ognl.getValue("#root.name", map, student)); /** * <pre> * context如果被添加之后, context里面的map都会变成跟root一个级别 * </pre> */ System.out.println(Ognl.getValue("#student1.name", map, student)); /** * <pre> * 常量 * 属性的引用 例如:user.name * 变量的引用 例如:#name * 静态变量的访问 使用 @class@field * 静态方法的调用 使用 @class@method(args), 如果没有指定 class 那么默认就使用 java.lang.Math. * 构造函数的调用 例如:new java.util.ArrayList(); * </pre> */ System.out.println(Ognl.getValue("@ongltest.Student@CODE", student)); System.out.println(Ognl.getValue("@java.lang.Math@abs(-1)", student)); /** * <pre> * ognl可以set值 * </pre> */ Ognl.setValue("name", student, "gc2"); System.out.println(Ognl.getValue("name", student)); /** * <pre> * ognl 还可以使用表达式判断 * </pre> */ System.out.println(Ognl.getValue("#root.phone.{? #this.equals('12345')}", student)); System.out.println(Ognl.getValue("#root.phone.{? #this.equals('12345')}[0]", student)); System.out.println(Ognl.getValue("#root.{ #this.phone.size > 1 ? #this.phone[1] : #this.phone[0] }", student)); } }