一文带你了解阿里的开源Java诊断工具 :Arthas

news2024/9/22 3:34:12

Arthas 是阿里开源的 Java 诊断工具,相比 JDK 内置的诊断工具,要更人性化,并且功能强大,可以实现许多问题的一键定位,是我用到的最方便的诊断工具。
下载和安装见官网 https://arthas.aliyun.com/doc/profiler.html
下面记录一些我工作中常用到的指令

1. dashboard : 展示当前进程信息

主要是两部分: 线程信息(按照cpu使用率倒序) 和 内存信息
可以快速发现 当前前几个cpu使用高的线程

2. thread :查看当前 JVM 的线程堆栈信息

image.png
thread : 获取当前所有线程 (按照cpu使用率倒序) 
thread 4602 threathe : 获取指定线程堆栈信息
thread -n 8 : 当前最忙的前8个线程并打印堆栈
thread -n 8  -i 3000 : 列出3s内最忙的8个线程并打印堆栈(-i 为采样时间)
thread -b :找出当前阻塞其他线程的线程
有时候我们发现应用卡住了, 通常是由于某个线程拿住了某个锁, 并且其他线程都在等待这把锁造成的。 
为了排查这类问题, arthas提供了thread -b, 一键找出那个罪魁祸首。
注意, 目前只支持找出synchronized关键字阻塞住的线程, 如果是java.util.concurrent.Lock, 目前还不支持。

3. heapdump : dump java heap, 类似jmap命令的heap dump功能。

heapdump /tmp/dump.hprof : dump到指定文件

heapdump --live /tmp/dump.hprof : 只dump live对象

下载dump文件后,可以使用MAT查看,MAT官网下载: Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation,主要要选择和本地一样的jvm版本,不然启动会失败。

使用MAT 分析 OOM 大内存问题,过程如下,是截取别的文章的过程。

 

 

4. watch: 观察到指定函数的调用情况。能观察到的范围为:返回值、抛出异常、入参

这个用于观察未打印日志的方法特别好用,包括入参 返参 和 异常

watch xxx.xxx.ABTestRecordServiceImpl doABTestWithLayer "{params,returnObj}" -x 3 -n 2 
-x 指定输出结果的属性遍历深度,默认为 1,最大值是4 ,
如果入参和出参是属性深度不一样(通常是不一样的,入参就是一个对象,出差会统一被一个Result包裹),需要分别设置才能观察到
params,returnObj : 指的是入参和返参,固定值
throwExp :观察异常信息 watch demo.MathGame primeFactors "{params,throwExp}" -e -x 2

-b :  在函数调用之前观察入参,因为入参有可能在执行被修改
-e :在函数异常之后观察
-s : 在函数返回之后观察,因为入参有可能在执行被修改
-n :  表示执行次数,即只打印n次,对于频繁调用来说,不设置的话,会打印很多

watch xxx.xxx.ABTestRecordServiceImpl doABTestWithLayer "{params,returnObj}" -x 3 -n 2  '#cost>100'
'#cost>100' : 按照耗时过滤,在很多方法中都可以通用,表示只打印执行超过100ms的方法

实例应用:生产上一个已废弃的接口突然被调用,报了一个异常,由于是老接口,我们并没有catch捕获,导致我们的日志filter没能打印出入参来,我们想根据入参来定位是哪里在调用,是谁在调用,这时候就可以用 watch 来获取方法的调用入参。
发现是运营突然上线了一个很久都没用的活动导致的,我们直接下线就可以了。

5. trace: 渲染和统计整个调用链路上的所有性能开销和追踪调用链路。

trace命令只会匹配到的函数里的子调用,并不会向下trace多层。因为trace是代价比较贵的,多层trace可能会导致最终要trace的类和函数非常多。

trace xxx.DiscountCXOpenServiceImpl aaaRespCXDTOList  '#cost > 50' -n 1
-n : 打印次数
'#cost>100' : 方法执行耗时
默认情况下,trace不会包含jdk里的函数调用,如果希望trace jdk里的函数,需要显式设置 --skipJDKMethod false。

6. stack:输出当前方法被调用的调用路径

如果一个方法被很多地方调用了,但是我们又不知道是被哪里调用时,可用这个命令查询

stack xxx.DiscountCacheUtil getStrategyCachaaa  -n 1 

7. profiler:生成应用热点的火焰图。

profiler start : 启动 
    启动时,默认采样的是cpu,可以通过 --event 来指定跟踪事件(cpu , alloc , lock )
profiler status :查看状态 
profiler stop : 停止
    停止时,默认生成html格式文件,可以通过 --file 指定生成路径和svg类型

从上面可以看出来耗时主要是在json parseArray格式化上。 横向长度越长,说明耗时越久

火焰图说明:火焰图是基于 perf 结果产生的 SVG 图片,用来展示 CPU 的调用栈。

  • y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。

  • x 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。

火焰图就是看顶层的哪个函数占据的宽度最大。只要有“平顶”(plateaus),就表示该函数可能存在性能问题。

颜色没有特殊含义,因为火焰图表示的是 CPU 的繁忙程度,所以一般选择暖色调。

默认生成的是html格式,只是html格式找东西不方便

8. 定位问题

8.1 CPU过高问题

现象描述:运维突然打电话说是生成线上节点cpu高达80%,而且还在增加,但是最新的一个版本并没有什么复杂的功能上线,而且日志在报一个批量插入主键冲突的异常,但是这个批量插入的功能已经上线很久,并且在很多地方都有用到,所以不能定位到是哪里的问题,这时候可以用arthas来查找问题原因

dashboard    -- 查看发现cpu高 不是GC引起的,占用CPU较多的线程只有一个
thread -n 6    -- 查看最繁忙的线程在执行的线程堆栈信息,然后可以直接定位具体代码行

8.2 TPS过低问题

现象描述:新上线一个高并发的复杂业务接口,压测的时候发现TPS只有50,明显是太低了,需要找出耗时较长的地方加以优化。

trace xxx.DiscountCXOpenServiceImpl aaaRespCXDTOList  '#cost > 100' -n 1
由于trace命令只会匹配到的函数里的子调用,并不会向下trace多层,而这个业务接口很复杂,所以一层层找下去的话,太过于麻烦,所以用profiler 生成应用热点的火焰图来查找比较好,

profiler start --event alloc
//等待10s
profiler stop --file /app/deploy/logs/profiler.svg

从上面的图中可以看出最终耗时比较久的竟然是 fastjson 的 parseArray方法,然后找到具体调用的地方后,
发现是因为内部缓存的原因,由于内部缓存用的公共方法,value为Stiring,所以每次getValue后,都需要parseArray 转化为List<Bean> ,之所以使用内部缓存就是因为value值太大,存redis时会造成网卡带宽不够,所以我们需要修改为自定义内部缓存,这样就可以避免 parseArray 方法,从而提高性能了。
private static ConcurrentHashMap<String, ConcurrentHashMap> cache = new ConcurrentHashMap<>();

这里其实还有一个问题,这种大对象频繁反序列化除了影响性能,还会每次都生成新的对象,导致在高并发下,内存也飙升。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/393060.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Gem5模拟器,如何在linux系统中查看内存、CPU、硬盘、进程、网络等信息(十二)

虽然说&#xff0c;这个记录的是与Linux相关的操作&#xff0c;每次查每次忘&#xff0c;必须写一个来归总一下&#xff0c;以免我漫山遍野找命令。但是不想新开一一个主题&#xff0c;再加上确实是在运行模拟器时会关注这方面的信息&#xff0c;就把这一节搁这儿啦。 常见的查…

MedCalc v20.217 医学ROC曲线统计分析参考软件

MedCalc是一款医学 ROC 曲线统计软件,用于ROC曲线分析的参考软件,医学工作者设计的医学计算器,功能齐全。它可以帮助医生快速作出普通的医学计算,从而对症下药。提供超过76种常用的规则和方法,包括:病人数据、单位参数、费用计算等等。甚至可以将图形另存为BMP,PNG,GIF…

ATL中__if_exists的替代方案

__if_exists 和 __if_not_exists 是什么? __if_exists 和 __if_not_exists 是微软 ATL (Active Template Library&#xff0c;活动模板库) 中的关键字&#xff0c;可以用来在编译期间测试一个标识符是否存在。如果该标识符存在&#xff0c;则其关联的语句将会被执行。 __if_e…

2023年3月软考中级(系统集成项目管理工程师)报名走起!!!

系统集成项目管理工程师是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目之一&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职…

【Vue】Vue常见的6种指令

Vue的6种指令-前言指令&#xff08;Directives&#xff09;是vue 为开发者提供的模板语法&#xff0c;用于辅助开发者渲染页面的基本结构。vue 中的指令按照不同的用途可以分为如下6 大类① 内容渲染指令 ② 属性绑定指令 ③ 事件绑定指令 ④ 双向绑定指令 ⑤ 条件渲染指令 ⑥ …

Fortinet设备审计

作为网络安全领域的领导者&#xff0c;Fortinet提供了多种网络安全解决方案&#xff0c;包括下一代防火墙&#xff0c;即FortiGate。通过EventLog Analyzer的FortiGate预定义报表以及其他Fortinet应用程序的详尽列表&#xff0c;充分发挥Fortinet设备的最大作用。FortiGate您的…

粒子群算法

粒子群算法1 粒子群算法介绍2 基本思想3 算法流程4 代码实现1 粒子群算法介绍 粒子群优化算法(PSO&#xff1a;Particle swarm optimization) 是一种进化计算技术&#xff08;evolutionary computation&#xff09;。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想是通过…

我建议,专家不要再建议了

作者| Mr.K 编辑| Emma来源| 技术领导力(ID&#xff1a;jishulingdaoli)关于买房&#xff0c;专家建议&#xff1a;不建议掏空六个钱包凑首付。&#xff08;网友&#xff1a;丈母娘等不到我自己挣够&#xff09;关于农村剩男多&#xff0c;城市剩女多&#xff0c;专家建议&am…

Adobe illustrator学习笔记

Adobe illustrator学习笔记 生命有限&#xff0c;设计无限 学习Adobe illustrator主要是用来制作SVG图片去制作字体图标&#xff0c;因此笔记内容大多会围绕SVG展开。 2023-3-5 1、Adobe illustrator简介 主要用于制作矢量图和插图 2、颜色模式介绍 显示颜色&#xff1a;RGB…

EXCEL里的各种奇怪计算问题:数字后面自动多了 0.0001, 数字后面位数变成000,以及一些取整,数学函数

1 公式计算后的数&#xff0c;用只粘贴数值后&#xff0c;后面自动多了 0.0001&#xff0c;导致不再是整数的问题 问题入戏 见第1个8400&#xff0c;计算时就出现了问题&#xff0c;按正常&#xff0c;这里8400应该是整数&#xff0c;而不应该带小数&#xff0c;但是确实就计…

我不写单元测试,被批了

我是3y&#xff0c;一年CRUD经验用十年的markdown程序员&#x1f468;&#x1f3fb;‍&#x1f4bb;常年被誉为职业八股文选手最近在看单元测试的东西&#xff0c;想跟大家聊聊我的感受。单元测试这块说实在的&#xff0c;我并不太熟悉&#xff0c;我几乎不写单元测试&#xff…

项目中维护一个随时更新的ui库的解决方案之一(uniapp+uview-plus)

1. 环境准备 需要准备两个仓库&#xff0c;第一个仓库用来存uniapp项目的相关代码&#xff0c;第二个用来存放uview-plus UI库的代码&#xff08;第二个仓库的仓库名称为uview-plus&#xff09; 2. 项目结构 我们uniapp目录结构大致如下 我们维护的ui组件应该是uni_modules下…

详解JAVA类加载器

目录 1.概述 2.双亲委派 3.ServiceClassLoader 4.URLClassLoader 5.加载冲突 1.概述 概念&#xff1a; 类加载器&#xff08;Class Loader&#xff09;是Java虚拟机&#xff08;JVM&#xff09;的一个重要组件&#xff0c;负责加载Java类到内存中并使其可以被JVM执行。类…

抢先看!界面控件DevExtreme 2023产品路线图曝光

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序&#xff0c;该套件附带功能齐…

【C++】优先级队列 priority_queue,仿函数和函数对象,反向迭代器

目录 1.介绍和实现 2.仿函数和函数对象 3.oj 4.反向迭代器 1.介绍和实现 他也在<queue>的头文件里 但是他的底层是堆&#xff0c;并不满足先入先出&#xff08;不要一看到queue就先入先出&#xff09; 他也是一个容器适配器&#xff0c;用vector适配的&#xff0c;为…

利用Qemu工具仿真ARM64平台

Windows系统利用Qemu仿真ARM64平台0 写在最前1 Windows安装Qemu1.1 下载Qemu1.2 安装Qemu1.3 添加环境变量1.4测试安装是否成功2. Qemu安装Ubuntu-Server-Arm-642.1 安装前的准备2.2 安装Ubuntu server arm 64位镜像3 Windows配置Qemu网络和传输文件3.1 参考内容3.2 Windows安装…

数据湖架构Hudi(五)Hudi集成Flink案例详解

五、Hudi集成Flink案例详解 5.1 hudi集成flink flink的下载地址&#xff1a; https://archive.apache.org/dist/flink/ HudiSupported Flink version0.12.x1.15.x、1.14.x、1.13.x0.11.x1.14.x、1.13.x0.10.x1.13.x0.9.01.12.2 将上述编译好的安装包拷贝到flink下的jars目录…

Python(青铜时代)——字符串

字符串的定义与操作 字符串就是 一串字符 &#xff0c;是编程语言中表示文本的数据类型 在Python中使用一对双引号 "" 或者一对单引号来定义. 使用索引获取一个字符串中 指定位置的字符&#xff0c;索引计数从0开始 可以用 for/while 循环遍历字符串中的每一个字符…

NGINX学习笔记(一):一篇了解NGINX的基本概念

NGINX是什么&#xff1f; NGINX是一款由俄罗斯人伊戈尔赛索耶夫使用C语言开发的、支持热部署的、轻量级的WEB服务器/反向代理服务器/电子邮件代理服务器&#xff0c;因为占用内存较少&#xff0c;启动极快&#xff0c;高并发能力强&#xff0c;所以在互联网项目中广泛应用。可…

CRM系统的四种数据分析法

在数字化时代&#xff0c;数据就是一切。因此&#xff0c;通过数据来支撑企业决策&#xff0c;才能确保制定的决策在更大程度上保持准确。因此&#xff0c;CRM客户管理系统的数据分析能力不容忽略。CRM获取的客户信息&#xff0c;就是很好的数据支撑样本&#xff0c;让企业从数…