Arthas-开源的java诊断工具,非常有用

常用命令

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  使用指定的ARTHAS_HOME目录执行

【Arthas用户文档】
https://github.com/alibaba/arthas/blob/master/README_CN.md
https://alibaba.github.io/arthas/dashboard

Original: https://www.cnblogs.com/zhangzongjian/p/11790074.html
Author: zhangzongjian
Title: Arthas-开源的java诊断工具,非常有用

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/606462/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • js学习笔记——条件 循环

    今天发现之前学的爱前端的课中JS部分函数等不全,果断换了一个课——渡一的《Web前端开发JavaScript高薪课堂》接着学习,不过废话有点多 语法:1、单if,条件成立,执行语句…

    Linux 2023年6月13日
    064
  • 【Javaweb】JSP标准标签库

    JSTL 1.什么是JSTL 2.版本 3.标签函数库 4.优点 JSTL基本概念 标签(Tag) 标签库(Tag library) 标签库描述文件(Tag Library Des…

    Linux 2023年6月14日
    0145
  • Python之面向对象-反射

    一、什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问,检测和修改它本省状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反…

    Linux 2023年6月14日
    095
  • [转帖]bash shell学习之变量

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年5月28日
    081
  • 账号分享

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月8日
    0102
  • find 查询命令 & 正则表达式

    今日内容 find 正则表达式 Linux 三剑客之 grep 内容详细 一、find 按名称或属性查询文件 按名称查询 find [查找目录] [参数] [] 通配符 : * 表…

    Linux 2023年5月27日
    089
  • Redis info参数总结(转)

    可以看到,info的输出结果是分几块的,有Servers、Clients、Memory等等,通过info后面接这些参数,可以指定输出某一块数据。 我刚开始在Gentoo上装的默认版…

    Linux 2023年5月28日
    0115
  • 题解poj2096

    然后,简单翻译一下: 有n个bug,s个程序,每天能发现一个bug,求在每个程序中发现至少一个bug并将每一个bug都至少发现一次的期望天数。典型的期望dp。 如果忘了什么是期望之…

    Linux 2023年6月6日
    063
  • 测试执行和软件缺陷

    测试执行 1.基本概念 测试执行就是执行测试用例、提交Bug 单、测试结论的评估和总结等一系列测试活动,测试执行不仅包含测试用例的执行,还包括其它测试活动. 2.注意事项 (1) …

    Linux 2023年6月7日
    066
  • 测试代理的墙是否是通的

    curl -v -x 代理ip:端口 目的ip:端口通过代理访问对方wget “http://目的IP:端口” -e use_proxy=yes -e ht…

    Linux 2023年6月14日
    0101
  • 【文件格式探究】EP.1 对ePub文件格式的初探

    这是”文件格式探究”专题的第 1 期——初探 “ePub” 文件格式。这个专题将会给各位读者呈现笔者探索各种文件格式的过程,具体则是…

    Linux 2023年6月13日
    0175
  • 唯一主键方案之数据库维护区间分配

    我们介绍一种基于数据库维护自增 ID 区间,结合内存分配的策略,这也是淘宝的 TDDL 等数据库中间件使用的主键生成策略。 使用这种方式首先在数据库中创建 sequence 表,其…

    Linux 2023年6月16日
    0207
  • 如何优化前端性能?

    导读:随着前端的范畴逐渐扩大,深度逐渐下沉,富前端必然带来的一个问题就是性能。特别是在大型复杂项目中,重前端业务可能因为一个小小的数据依赖,导致整个页面卡顿甚至崩溃。本文基于Qui…

    Linux 2023年6月8日
    0109
  • win11下关于安装umi成功后CMD命令不能使用的问题

    先找到你安装的umi全局路径 yarn global bin 然后把这个路径添加到系统变量中去:PATH 还是不能用的话就是找到 umi.cmd 文件的目录,把里面的C盘符号前面的…

    Linux 2023年6月14日
    0105
  • Java 集合框架

    一、 Collection集合 1.1 集合概述 集合:集合是java中提供的一种容器,可以用来存储多个数据。 数组的长度是固定的。集合的长度是可变的。 数组中存储的是同一类型的元…

    Linux 2023年6月7日
    077
  • python 练习题:请利用循环依次对list中的每个名字打印出Hello, xxx!

    方法一: python;gutter:true; -<em>- coding: utf-8 -</em>- 请利用循环依次对list中的每个名字打印出Hel…

    Linux 2023年6月8日
    092
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球