点击返回上层目录

原创声明:作者: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. 【Leetcode】104. 二叉树的最大深度

    题目 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例:给定二叉树 [3,9,20,null,null,15,7 ...

  2. 深入理解Mysql——锁、事务与并发控制

    本文对锁.事务.并发控制做一个总结,看了网上很多文章,描述非常不准确.如有与您观点不一致,欢迎有理有据的拍砖! mysql服务器逻辑架构 每个连接都会在mysql服务端产生一个线程(内部通过线程池管理 ...

  3. Uber是一部无所不在的数字出行物联网

    "Uber化"是整合服务产业与智能车联网的知识经济,是数字时代展现个人化生活态度无可逆转的趋势,是新兴数字族群运用数字工具集体分享出行资源的平台. 搭过Uber的消费者,对其服务质 ...

  4. andorid jar/库源码解析之错误提示

    目录:andorid jar/库源码解析 错误: 错误1: Error: Static interface methods are only supported starting with Andro ...

  5. AWS bind: cannot assign requested address

    最近在AWS上安装Redis,遇到一个坑. Redis默认配置文件中有个bind配置项,默认为127.0.0.1.此时只能在服务器内部访问Redis. 为了从服务器外部访问Redis,我给bind添加 ...

  6. Bootstrap Table 3 官方文档

    备查 Bootstrap Table 3 官方文档 示例

  7. 【HBase】HBase基本介绍和基础架构

    目录 基本介绍 概述 特点 HBase和Hadoop的关系 RDBMS与HBase的对比 特征 基础架构 基本介绍 概述 HBase是bigtable的开源java版本,是建立在HDFS之上,提供高可 ...

  8. Day_09【常用API】扩展案例7_验证QQ号是否正确

    需求说明 请用户输入一个"QQ号码",我们来判断这个QQ号码是否正确 要求:使用方法来完成判断功能 验证规则: 1)必须是5-12位数字: 2)首位不能是0: package co ...

  9. hdu2336 (匈牙利最大匹配+二分)

    Describe 这是一个简单的游戏,在一个n*n的矩阵中,找n个数使得这n个数都在不同的行和列里并且要求这n个数中的最大值和最小值的差值最小. Input 输入一个整数T表示T组数据. 对于每组数据 ...

  10. java 8 stream、lambda表达式对list操作分组、过滤、求和、最值、排序、去重

    1.分组 通过groupingBy分组指定字段 list.stream().collect(Collectors.groupingBy(User::getSex)); 2.过滤 通过filter方法过 ...