点击返回上层目录

原创声明:作者:Arnold.zhao 博客园地址:https://www.cnblogs.com/zh94

Arthas

本文主要聚焦于快速上手并使用Arthas,所以对于基本的概念及使用目的此处不再赘述,详情可参考如下链接

关于Arthas的基本概念可参考:

https://github.com/alibaba/arthas/blob/master/README_CN.md

关于Arthas等相关JVM Debug工具的实现原理可参考:

https://www.cnblogs.com/meituantech/p/11670535.html

https://blog.csdn.net/u010862794/article/details/87773434

快速使用

启动Arthas

$ $ curl -O https://alibaba.github.io/arthas/arthas-demo.jar
$ $ java -jar arthas-boot.jar
* [1]: 35542
[2]: 71560 arthas-demo.jar
1
此处选择序号来表示当前所要链接的进程;

dashboard

介绍:输入dashboard,按回车/enter,会展示当前进程的信息,按ctrl+c可以中断执行。

优势:当在生产环境中我们需要查看当前进程内线程的运行情况时需要使用Linux原生的 top -p PID -H来获取线程信息;当需要查看进程的GC情况时,则需要使用jstat 或 jconsole等工具来监控内存的变化;而此处dashboard控制台一键集成,想要实时观察GC和线程信息则再也不用连续的观察多个面板了;

thread

介绍:通过使用dashboard获取到当前所有的线程运行信息后,使用thread 1打印当前ID为1的线程栈信息

优势:当生产环境一个线程CPU飙高,或者锁死的情况时,我们常规的做法是 jstack 快速打印当前进程的线程堆栈信息,然后再具体分析对应的堆栈日志来依次观察具体的问题点;而此处当我们使用dashboard捕获到具体的异常线程时,直接使用Arthas 的thread命令便可以直接打印当前指定线程的栈信息,快速定位具体哪块方法体所引起的问题;

[arthas@23846]$ thread 1
"main" Id=1 TIMED_WAITING
at java.lang.Thread.sleep(Native Method)
at java.lang.Thread.sleep(Thread.java:340)
at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
at demo.MathGame.main(MathGame.java:17)

sc

介绍:查看当前JVM中所加载的类信息,此处表示查看当前MatchGame类的具体信息(支持正则匹配)

优势:通过使用sc命令可以排查你当前项目中的某些类是否被加载进来,或者在Spring中某些依赖是否被正确加载等问题

[arthas@23846]$ sc -d *MathGame		(-d表示查看detail详情,关于当前sc命令的options参数,可以使用 sc -h 获取具体的参数格式)
class-info demo.MathGame (表示当前类的包路径信息)
code-source /opt/shengheApp/arthas/arthas-demo.jar(当前类加载自那个jar包中)
name demo.MathGame
isInterface false (是否是接口)
isAnnotation false (是否是注解)
isEnum false (是否是枚举等等)
isAnonymousClass false
isArray false
isLocalClass false
isMemberClass false
isPrimitive false
isSynthetic false
simple-name MathGame (类简称)
modifier public (当前类的访问修饰符)
annotation
interfaces
super-class +-java.lang.Object (当前类的父类)
class-loader +-sun.misc.Launcher$AppClassLoader@70dea4e(当前类加载自那个ClassLoader)
+-sun.misc.Launcher$ExtClassLoader@708ab80c
classLoaderHash 70dea4e
Affect(row-cnt:1) cost in 7 ms.

jad

介绍:使用jad来反编译代码,类似于我们桌面端常用的 jd-gui等工具

优势:生产环境更新代码后,很可能会出现代码更新后不生效等问题(比如本地代码打包未重新编译等),通过使用jad反编译代码后,可以快速确认当前线上代码是否是本地的最新代码等问题;并且jad反编译后的代码可读性更强,相比于jdk自带的javap反编译命令要好很多

[arthas@23846]$ jad demo.MathGame

ClassLoader:
+-sun.misc.Launcher$AppClassLoader@70dea4e
+-sun.misc.Launcher$ExtClassLoader@708ab80c
Location:
/opt/shengheApp/arthas/arthas-demo.jar
/*
* Decompiled with CFR.
*/
package demo;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.TimeUnit;
public class MathGame {
private static Random random = new Random();
public int illegalArgumentCount = 0;
public List<Integer> primeFactors(int number) {
if (number < 2) {
++this.illegalArgumentCount;
throw new IllegalArgumentException("number is: " + number + ", need >= 2");
}
ArrayList<Integer> result = new ArrayList<Integer>();
int i = 2;
while (i <= number) {
if (number % i == 0) {
result.add(i);
number /= i;
i = 2;
continue;
}
++i;
}
return result;
}

原创声明:作者:Arnold.zhao 博客园地址:https://www.cnblogs.com/zh94

watch(重要)

通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此在线上、预发使用时,请尽量明确需要观测的类、方法以及条件,诊断结束要执行 stop 或将增强过的类执行 reset 命令。

介绍:方法执行数据观测,可以轻松的观察到当前指定方法的调用情况以及通过书写特定的OGNL表达式来进行对应变量的查看,能观察到的范围为当前方法的:返回值、抛出异常、入参

关于OGNL表达式的说明可参考:

官网:https://commons.apache.org/proper/commons-ognl/language-guide.html

博客:https://cloud.tencent.com/developer/article/1554323

重要说明:

  • 当前watch的命令实际上只是给当前所要被观察的方法增加一个切面的代码来实现后续的统计;

  • 而我们通过切面则可以捕获到当前被执行方法的以下参数:如方法的入参是什么?方法的出参是什么?方法的执行结果是否抛出异常,抛出的异常栈是什么等信息;

  • 那么这些所有被捕获到的观察信息,实际上都被封装到了一个通用的通知对象Advice的类中,当前Advice类的属性及包含了方法的入参,也包含了方法的出参等数据

  • 而我们所书写的OGNL表达式,实际上就是针对于当前的Advice的类属性而写,比如此时OGNL表达式写的是:{params,returnObj} ,那么此OGNL所表示的含义则是输出当前被观察类的入参(params),和返回结果(returnObj)的内容;

关于当前Advice通知类的具体参数都有哪些,可以参考该链接:https://arthas.gitee.io/advice-class.html

watch命令格式如下:

参数名称 参数说明
class-pattern 类名表达式匹配
method-pattern 方法名表达式匹配
express 观察表达式(OGNL)
condition-express 条件表达式
-b 在方法调用之前观察
-e 在方法异常之后观察
-s 在方法返回之后观察
-f 在方法结束之后(正常返回和异常返回)观察
-E 开启正则表达式匹配,默认为通配符匹配
-x value 输出结果的属性遍历深度,默认为 1

优势:想要调试某个线上服务的偶发性BUG,但是又不能重启线上服务的情况下,通过对当前所需监控的方法以及各个被调用的嵌套方法都增加watch监控的方式以此来实现动态DEBUG的效果

劣势:不可以在指定的代码行增加动态代码的方式来达到DEBUG的效果;BTrace可以实现更佳的服务器线上DEBUG效果,但使用方式相对更加重一些

执行命令解读:
watch demo.MathGame【指定类路径】 primeFactors【指定被观察方法名】 "{params,returnObj}"【指定OGNL表达式】 "params[0]<0" 【条件表达式,表示当前入参<0时则触发检测】 -x 3【指定输出结果的遍历深度】 -f【表示在方法结束之后触发观察】 [arthas@23846]$ watch demo.MathGame primeFactors "{params,returnObj}" "params[0]<0" -x 3 -f
Press Q or Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 36 ms.
ts=2020-04-29 15:47:59; [cost=0.197494ms] result=@ArrayList[
@Object[][
@Integer[-56580], (当前被观察方法的入参)
],
null, (当前被观察方法的出参)
]
ts=2020-04-29 15:48:03; [cost=0.073761ms] result=@ArrayList[
@Object[][
@Integer[-161310], (当前被观察方法的入参)
],
null, (当前被观察方法的出参)
] 由于我们上面执行命令时设置的条件表达式是只针对 入参 < 0 的执行方法才进行输出,所以以上两个输出的结果全部是入参为负数时的数据

reset

介绍:用于还原指定的增强类,使用watch等命令对指定的方法进行了相关debug诊断完以后,则需要使用reset进行类的还原

还原指定类:
[arthas@23846]$ reset demo.MathGame
Affect(class-cnt:0 , method-cnt:0) cost in 0 ms. 还原所有类:
[arthas@23846]$ reset
Affect(class-cnt:0 , method-cnt:0) cost in 1 ms.

快速上手Alibaba Arthas的更多相关文章

  1. Java线上问题排查神器Arthas快速上手与原理浅谈

    前言 当你兴冲冲地开始运行自己的Java项目时,你是否遇到过如下问题: 程序在稳定运行了,可是实现的功能点了没反应. 为了修复Bug而上线的新版本,上线后发现Bug依然在,却想不通哪里有问题? 想到可 ...

  2. springcloud - alibaba快速上手 - 更新完毕

    1.简单对比一下springcloud与springcloud-alibaba 2.准备知识 官网:https://nacos.io/zh-cn/ 查看cloud和springboot的对应关系 ht ...

  3. 阿里语音识别(语音转文字)java调用全程手把手详解-适合中小学生快速上手

    阿里语音识别服务java调用全程手把手详解-适合中小学生快速上手 阿里语音识别与百度语音识别的调用对比: 用例:1分30秒的录音文件    百度用时:3秒    阿里用时:30秒    识别准确率来看 ...

  4. 【Python五篇慢慢弹】快速上手学python

    快速上手学python 作者:白宁超 2016年10月4日19:59:39 摘要:python语言俨然不算新技术,七八年前甚至更早已有很多人研习,只是没有现在流行罢了.之所以当下如此盛行,我想肯定是多 ...

  5. 快速上手Unity原生Json库

    现在新版的Unity(印象中是从5.3开始)已经提供了原生的Json库,以前一直使用LitJson,研究了一下Unity用的JsonUtility工具类的使用,发现使用还挺方便的,所以打算把项目中的J ...

  6. [译]:Xamarin.Android开发入门——Hello,Android Multiscreen快速上手

    原文链接:Hello, Android Multiscreen Quickstart. 译文链接:Hello,Android Multiscreen快速上手 本部分介绍利用Xamarin.Androi ...

  7. [译]:Xamarin.Android开发入门——Hello,Android快速上手

    返回索引目录 原文链接:Hello, Android_Quickstart. 译文链接:Xamarin.Android开发入门--Hello,Android快速上手 本部分介绍利用Xamarin开发A ...

  8. 快速上手seajs——简单易用Seajs

    快速上手seajs——简单易用Seajs   原文  http://www.cnblogs.com/xjchenhao/p/4021775.html 主题 SeaJS 简易手册 http://yslo ...

  9. Git版本控制Windows版快速上手

    说到版本控制,之前用过VSS,SVN,Git接触不久,感觉用着还行.写篇博文给大家分享一下使用Git的小经验,让大家对Git快速上手. 说白了Git就是一个控制版本的工具,其实没想象中的那么复杂,咱在 ...

随机推荐

  1. 现代软件工程讲义 如何提出靠谱的项目建议 NABCD

    互联网时代对于创新者来说, 既是一个伟大的时代, 又是一个糟糕的时代. 你有很多机会做出影响世界的产品,  但是, 似乎任何想法都被别人想到过了, 做出来了, 上市了, 移植到各种平台上去了-  那么 ...

  2. The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 B so easy

    题目链接:https://nanti.jisuanke.com/t/41384 这题暴力能过,我用的是并查集的思想,这个题的数据是为暴力设置的,所以暴力挺快的,但是当他转移的点多了之后,我觉得还是我这 ...

  3. 【Java新特性】Lambda表达式典型案例,你想要的的都在这儿了!!

    写在前面 不得不说,有些小伙伴的学习热情真高,学完了Lambda表达式的语法,想来几个典型案例再强化下.于是问冰河能否给几个Lambda表达式的典型使用示例.于是乎,便有了这篇文章. 案例一 需求 调 ...

  4. 自动化运维工具Ansible之Tests测验详解

    Ansible Tests 详解与使用案例 主机规划 添加用户账号 说明: 1. 运维人员使用的登录账号: 2. 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务数据乱放: 3. 该用 ...

  5. 区间dp 例题

    D - 石子合并问题--直线版 HRBUST - 1818 这个题目是一个区间dp的入门,写完这个题目对于区间dp有那么一点点的感觉,不过还是不太会. 注意这个区间dp的定义 dp[i][j] 表示的 ...

  6. 一篇博客带你轻松应对java面试中的多线程与高并发

    1. Java线程的创建方式 (1)继承thread类 thread类本质是实现了runnable接口的一个实例,代表线程的一个实例.启动线程的方式start方法.start是一个本地方法,执行后,执 ...

  7. mysql优化–explain分析sql语句执行效率

    Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优 ...

  8. JVM垃圾回收器(三)

    垃圾回收知识点 引用计数 给对象添加一个引用计数器,每当一个地方引用这个对象,这个计算器就加1.如果引用失效,那计算器就减1.如果计算器数量为0,那这个对象就是失效的. 但是如果2个对象虽然不用了,但 ...

  9. 【Hadoop离线基础总结】linux基础增强

    linux基础增强 查找命令 grep命令  (print lines matching a pattern) 概述: grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打 ...

  10. ubuntu安装java方法

    详情请点链接:https://www.digitalocean.com/community/tutorials/how-to-install-java-with-apt-get-on-ubuntu-1 ...