• Arthas


    常用命令

    help                查看帮助
    help COMMAND        查看指定命令的详细帮助
    COMMAND -h          查看指定命令的详细帮助
    double tab          查看支持的所有命令
    
    
    dashboard               查看线程JVM信息仪表盘
    
    thread                  查看所有线程
    thread 51               查看指定线程堆栈
    thread -n 5             查看前5个线程堆栈
    thread -n -1            查看所有线程堆栈
    thread -b               查看阻塞线程
    thread -i 2000          在计算CPU使用率时指定采样间隔(2秒后输出结果)
    
    jad javax.servlet.Servlet       对jvm已加载的类进行反编译
    >>>
    java -jar cfr-0.148.jar /tmp/TestClass.class 可以反编译class文件,org.benf:cfr0.148
    <<<
    
    mc -c ClassLoaderHash /tmp/Test.java    编译java文件
    <<<
    有依赖关系的单个java文件用javac编译是肯定不行的。内存编译器mc则可以,但也有可能会个别代码编译失败
    <<<
    
    sc javax.servlet.Servlet        查找jvm已加载的类
    sc -d javax.servlet.Servlet     查找jvm已加载的类,打印详细
    
    stack com.TestClass testMethod            查看方法的调用堆栈,重新触发后打印
    
    trace com.TestClass testMethod            查看方法的子调用方法的耗时
    
    monitor -c 3 com.TestClass testMethod                       监控方法的调用次数,成功率等信息,每隔3秒输出一次。
    
    classloader                                                 查看类加载器数量,以及每个加载器加载的类数量
    
    【ognl】                                                 执行表达式
    ognl '@java.lang.System@out.println("hello")'            调用静态方法
    ognl '#str=new String("hello"), #str.length()'           这样都行
    ognl '#value1=@System@getProperty("java.home"), #value2=@System@getProperty("java.runtime.name"), {#value1, #value2}'   执行多个表达式,并赋值给临时变量
    
    
    【redefine + sc + jad】                                 实现不重启加载class
    redefine                                                加载外部的.class文件,redefine jvm已加载的类
    redefine -c ClassLoaderHash /tmp/TestClass.class        将修改后编译出来的class文件放到指定目录,并redefine
    >>>
    其中ClassLoaderHash为该类的类加载器HashCode,可通过"sc com.TestClass -d"查询
    必须指定ClassLoaderHash,否则修改不生效。redefine后可以使用jad反编译查看修改。
    注意:redefine后的原来的类不能恢复,可以redefine原始的class文件来还原
    限制:1. 不允许新增加field/method 2. 修改正在跑的函数,没有退出不能生效
    <<<
    
    【watch】                                                                                 观察方法的执行,有点像在方法中打断点debug。用法同tt中的-w,相当于实时的tt
    watch 类 方法 观察表达式 条件表达式                                                       用法
    watch com.TestClass testMethod returnObj                                        观察方法的执行,包括观察当前对象、传入参数、返回值、抛出的异常等等
    watch com.TestClass testMethod "@java.lang.Thread@currentThread().getName()"              调用静态方法
    watch com.TestClass testMethod target                                                     观察当前对象
    watch com.TestClass testMethod 'new String("hello")'                                      像极了debug模式的表达式
    watch com.TestClass testMethod {params[0],returnObj} -e                                   观察方法执行的第一个入参合和返回值,仅当方法抛出异常时才打印
    >>>
    https://github.com/alibaba/arthas/issues/71         表达式用法说明
    https://alibaba.github.io/arthas/advice-class.html  表达式变量说明, 如target、params、returnObj等变量
    方法重载问题:使用条件表达式(stack,trace等作用于方法的命令也都适用)
    1. 指定参数长度 watch com.TestClass testMethod params[0] params.length==2
    2. 指定某参数类型 watch com.TestClass testMethod params[0] 'params[1] instanceof String'
    <<<
    
    
    【tt】                                      记录方法调用的时间片信息
    tt -t com.TestClass testMethod              开始记录
    tt -l                                       查看历史记录
    tt -i ID                                    查看某个时间片信息(含参数值)
    tt -i ID -w params[0]                       查看时间片方法的第一个参数的值,-w用法同watch命令
    tt -i ID -w params[0].length()              查看时间片方法的第一个参数的值,支持对象访问
    tt -i ID -w {params[0],param[1]}            查看时间片方法的多个参数的值
    >>>
    spring mvc应用
    拦截RequestMappingHandlerAdapter这个调用,获取到spring context为所欲为
    tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod
    tt -i invokeHandlerMethodID -w 'target.getApplicationContext().getBean("helloWorldService")'
    <<<

    使用/安装指南【下载工具】

    https://alibaba.github.io/arthas/arthas-boot.jar
    或
    https://alibaba.github.io/arthas/install.sh(sh install.sh下载启动脚本as.sh)
     
    【使用条件】
    环境需要安装java
    依赖jdk/lib/tools.jar
    如果只有jre,可拷贝jdk的tools.jar到jre/lib/下
    as.sh需要telnet命令,若无telnet可使用arthas-boot.jar方式
     
    【启动工具】
    java -jar arthas-boot.jar 或 sh as.sh
    
    第一次启动会下载arthas-3.1.4-bin.zip到/root/.arthas/lib/3.1.4/arthas下并解压。
    每次启动会检测是否有java进程,然后输入数字选择需要诊断的进程。(PS:工具检测进程的原理$JAVA_HOME/bin/jps -l -v)
    sh as.sh --repo-mirror aliyun         //如果下载速度比较慢,可以使用aliyun的镜像
    sh as.sh --target-ip 192.168.1.9      //指定telnet监听IP
    sh as.sh -h                           //查看更多启动配置
    sh as.sh PID                          //指定进程诊断
    
    linux-8ku8:/opt/arthas # sh as.sh
    Arthas script version: 3.1.4
    [INFO] JAVA_HOME: /opt/jdk1.8.0_74
    [INFO] Process 10528 already using port 3658
    [INFO] Process 10528 already using port 8563
    Found existing java process, please choose one and hit RETURN.
    * [1]: 10528 org.apache.catalina.startup.Bootstrap
    
    【默认自动下载目录】
    linux-8ku8:~/.arthas/lib/3.1.4/arthas # ls -lh
    total 22M
    -rw-r--r-- 1 root root  11M Jun 22 16:13 arthas-3.1.4-bin.zip
    -rw-r--r-- 1 root root 8.2K Sep 25  2019 arthas-agent.jar
    -rw-r--r-- 1 root root 109K Sep 25  2019 arthas-boot.jar
    -rw-r--r-- 1 root root 394K Sep 25  2019 arthas-client.jar
    -rw-r--r-- 1 root root  11M Sep 25  2019 arthas-core.jar
    -rw-r--r-- 1 root root 3.7K Sep 25  2019 arthas-demo.jar
    -rw-r--r-- 1 root root 2.9K Sep 25  2019 arthas-spy.jar
    -rwxr-xr-x 1 root root 7.6K Sep 25  2019 as-service.bat
    -rwxr-xr-x 1 root root 3.1K Sep 25  2019 as.bat
    -rwxr-xr-x 1 root root  28K Sep 25  2019 as.sh
    -rwxr-xr-x 1 root root  635 Sep 25  2019 install-local.sh
    
    【启动成功】
    linux-8ku8:/opt/arthas # sh as.sh
    ........
      ,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---.
     /  O   |  .--. ''--.  .--'|  '--'  | /  O   '   .-'
    |  .-.  ||  '--'.'   |  |   |  .--.  ||  .-.  |`.  `-.
    |  | |  ||  |      |  |   |  |  |  ||  | |  |.-'    |
    `--' `--'`--' '--'   `--'   `--'  `--'`--' `--'`-----'
    ........
    [arthas@10528]$ help                   //查看帮助;double tab查看支持的所有命令;help COMMAND查看指定命令的详细帮助
    [arthas@10528]$ exit                   //断开连接,工具还在运行。重新执行as.sh可再次进入,或者telnet 127.0.0.1 3658也可再次重连(后者连接速度超快)
    [arthas@10528]$ shutdown 或 stop       //关闭工具
    
    【离线安装】
    将arthas-3.1.4-bin.zip解压到/root/.arthas/lib/3.1.4/arthas/目录下
    非root用户解压到/home/$USER/.arthas/lib/3.1.4/arthas/目录下,注意修改文件的用户属组
    然后启动即可,不同用户下执行as.sh,会调用各自用户家目录下的arthas
    只要创建了ARTHAS_HOME目录,即/home/$USER/.arthas/lib/$USER_VERSION/arthas,启动as.sh时就不会联网下载包,之后把包解压进去即可。

    快捷安装:解压arthas-3.1.4-bin.zip后执行install-local.sh即可。原理上面的一样,自动创建ARTHAS_HOME目录并拷贝包进去。
    ARTHAS_HOME目录也可以是自定义的路径,sh as.sh --arthas-home <value> 使用指定的ARTHAS_HOME目录执行
    【Arthas用户文档】
    https://github.com/alibaba/arthas/blob/master/README_CN.md https://alibaba.github.io/arthas/dashboard
  • 相关阅读:
    旋转坐标转换的矩阵推导
    Union的妙用和注意
    OpenGL环境搭建Windows+Mac+Linux
    RichLabel基于Cocos2dx+Lua v3.x
    Cocos2dx+lua中Color参数的坑
    常见开源协议
    lua序列化(支持循环引用)
    lua标签解析器
    Markdown基本语法
    python3爬取墨迹天气并发送给微信好友,附源码
  • 原文地址:https://www.cnblogs.com/zhangzongjian/p/11790074.html
Copyright © 2020-2023  润新知