常用命令

help                查看帮助
help COMMAND 查看指定命令的详细帮助
COMMAND -h 查看指定命令的详细帮助
double tab 查看支持的所有命令 dashboard 查看线程JVM信息仪表盘 thread 查看所有线程
thread 查看指定线程堆栈
thread -n 查看前5个线程堆栈
thread -n - 查看所有线程堆栈
thread -b 查看阻塞线程
thread -i 在计算CPU使用率时指定采样间隔(2秒后输出结果) jad javax.servlet.Servlet 对jvm已加载的类进行反编译
>>>
java -jar cfr-0.148.jar /tmp/TestClass.class 可以反编译class文件,org.benf:cfr0.
<<< 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 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文件来还原
限制:. 不允许新增加field/method . 修改正在跑的函数,没有退出不能生效
<<< 【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[],returnObj} -e 观察方法执行的第一个入参合和返回值,仅当方法抛出异常时才打印
>>>
https://github.com/alibaba/arthas/issues/71 表达式用法说明
https://alibaba.github.io/arthas/advice-class.html 表达式变量说明, 如target、params、returnObj等变量
方法重载问题:使用条件表达式(stack,trace等作用于方法的命令也都适用)
. 指定参数长度 watch com.TestClass testMethod params[] params.length==
. 指定某参数类型 watch com.TestClass testMethod params[] 'params[1] instanceof String'
<<< 【tt】 记录方法调用的时间片信息
tt -t com.TestClass testMethod 开始记录
tt -l 查看历史记录
tt -i ID 查看某个时间片信息(含参数值)
tt -i ID -w params[] 查看时间片方法的第一个参数的值,-w用法同watch命令
tt -i ID -w params[].length() 查看时间片方法的第一个参数的值,支持对象访问
tt -i ID -w {params[],param[]} 查看时间片方法的多个参数的值
>>>
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.-bin.zip到/root/.arthas/lib/3.1./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.
[INFO] JAVA_HOME: /opt/jdk1..0_74
[INFO] Process already using port
[INFO] Process already using port
Found existing java process, please choose one and hit RETURN.
* []: org.apache.catalina.startup.Bootstrap 【默认自动下载目录】
linux-8ku8:~/.arthas/lib/3.1./arthas # ls -lh
total 22M
-rw-r--r-- root root 11M Jun : arthas-3.1.-bin.zip
-rw-r--r-- root root .2K Sep arthas-agent.jar
-rw-r--r-- root root 109K Sep arthas-boot.jar
-rw-r--r-- root root 394K Sep arthas-client.jar
-rw-r--r-- root root 11M Sep arthas-core.jar
-rw-r--r-- root root .7K Sep arthas-demo.jar
-rw-r--r-- root root .9K Sep arthas-spy.jar
-rwxr-xr-x root root .6K Sep as-service.bat
-rwxr-xr-x root root .1K Sep as.bat
-rwxr-xr-x root root 28K Sep as.sh
-rwxr-xr-x root root Sep install-local.sh 【启动成功】
linux-8ku8:/opt/arthas # sh as.sh
........
,---. ,------. ,--------.,--. ,--. ,---. ,---.
/ O \ | .--. ''--. .--'| '--' | / O \ ' .-'
| .-. || '--'.' | | | .--. || .-. |`. `-.
| | | || |\ \ | | | | | || | | |.-' |
`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----'
........
[arthas@]$ help //查看帮助;double tab查看支持的所有命令;help COMMAND查看指定命令的详细帮助
[arthas@]$ exit //断开连接,工具还在运行。重新执行as.sh可再次进入,或者telnet 127.0.0.1 3658也可再次重连(后者连接速度超快)
[arthas@]$ shutdown 或 stop //关闭工具 【离线安装】
将arthas-3.1.-bin.zip解压到/root/.arthas/lib/3.1./arthas/目录下
非root用户解压到/home/$USER/.arthas/lib/3.1./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

Arthas - 开源的java诊断工具,非常有用的更多相关文章

  1. 款阿里开源的 Java 诊断工具Arthas

    Arthas是什么鬼? Arthas是一款阿里巴巴开源的 Java 线上诊断工具,功能非常强大,可以解决很多线上不方便解决的问题. Arthas诊断使用的是命令行交互模式,支持JDK6+,Linux. ...

  2. 阿里巴巴开源框架java诊断工具--Arthas

    下载:arthas wget https://alibaba.github.io/arthas/arthas-boot.jar java -jar arthas-boot.jar --target-i ...

  3. 推荐一款阿里开源的 Java 诊断工具,好用到爆!

    Arthas是什么鬼? Arthas是一款阿里巴巴开源的 Java 线上诊断工具,功能非常强大,可以解决很多线上不方便解决的问题. Arthas诊断使用的是命令行交互模式,支持JDK6+,Linux. ...

  4. 一款阿里开源的 Java 诊断工具

    Arthas是什么鬼? Arthas是一款阿里巴巴开源的 Java 线上诊断工具,功能非常强大,可以解决很多线上不方便解决的问题. Arthas诊断使用的是命令行交互模式,支持JDK6+,Linux. ...

  5. Arthas阿里开源的 Java 诊断工具

    当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 1.这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 2.我改的代码为什么没有执行到?难道是我没 commi ...

  6. Arthas Alibaba 开源 Java 诊断工具

    Arthas 用户文档 English Docs Arthas(阿尔萨斯) 能为你做什么? Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱. 当你遇到以下类似问题而束手无策时,A ...

  7. 阿里JAVA诊断工具Arthas的初步使用

    Arthas 是Alibaba开源的Java诊断工具,主要解决以下问题: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 comm ...

  8. Alibaba Java诊断工具Arthas查看Dubbo动态代理类

    原创/朱季谦 阅读Dubbo源码过程中,会发现,Dubbo消费端在做远程调用时,默认通过 Javassist 框架为服务接口生成动态代理类,接着再去调用代理类实现远程接口调用.在阅读这部分源码时,最后 ...

  9. java 诊断工具——Arthas

    该说不说!小编做的这些功能,最讨厌的就是优化!某些前辈大佬写的代码小辈我实在不敢恭维!那逻辑!那sql! 接下来!今天的主角就登场了,阿里巴巴最近开源出来的一个针对 java 的工具,主要是针对 ja ...

随机推荐

  1. Windows忘记BIOS密码/操作系统密码处理办法汇总

    一.说明 关于电脑,在大学之前是知之甚少的.举几个例子,一是刚上大学时我还是分不清主机和显示器哪个才是电脑:二是应该是大一上学期陪窒友Z到电科买电脑,我问导购员XP和Win7什么关系----我一直怀疑 ...

  2. Scala 数组操作之Array、ArrayBuffer以及遍历数组

    ArrayBuffer 在Scala中,如果需要类似于Java中的ArrayList这种长度可变的集合类,则可以使用ArrayBuffer. // 如果不想每次都使用全限定名,则可以预先导入Array ...

  3. ubuntu18 docker中部署ELK

    ELK是ElasticSearch.Logstash.Kibana的简称,一般用于日志系统,从日志收集,日志转储,日志展示等入手,用以提供简洁高效的日志处理机制. 鉴于没有额外的机器,这里就用dock ...

  4. async与await总结

    全手打原创,转载请标明出处:https://www.cnblogs.com/dreamsqin/p/11533174.html,多谢,=.=~ 抛出3个疑问: 1.async是干哈的? 2.await ...

  5. 『正睿OI 2019SC Day8-Day17』

    于是就迎来\(10\)天的自闭考试了,每天写点小总结吧. Day8 第一天就很自闭啊,考题分别是数学题+建模题+图论. 前两道题都没有什么算法,但是难度还是有的,于是就做不太出来,特别是第一题.第二题 ...

  6. FRP represents an intersection of two programming paradigms.

    FRP represents an intersection of two programming paradigms. Functional programming Functional progr ...

  7. (9)ASP.NET Core 中的MVC路由二

    1.URL生成 MVC应用程序可以使用路由的URL生成功能,生成指向操作(Action)的URL链接. IUrlHelper 接口用于生成URL,是MVC与路由之间的基础部分.在控制器.视图和视图组件 ...

  8. Syste.IO命名空间下的流操作类之间的关系

  9. web技术栈开发原生应用-多端共用一套代码

    weex: vuejs开发原生应用 nativescript: vuejs开发原生应用 ReactNative = reactjs开发原生应用 ionic = angularjs 开发原生应用

  10. 【开发笔记】-通过js控制input禁止输入空格

    <input type="text" id="fname" onkeyup="myFunction(id)"> <scri ...