Arthas在线诊断工具使用
Arthas 命令
下载地址
下载地址:Releases · alibaba/arthas · GitHub
参考官方文档:https://arthas.aliyun.com/doc/quick-start.html
使用版本arthas-all-3.6.0版本,windows环境下使用
解压到指定目录 /xx/xx/arthas/
详情如下图
启动Arthas
Windows 控制台 cmd
cd /xx/xx/arthas/
启动命令 java -jar arthas-boot.jar
启动后如下图
蓝色方框表示java进程下标,输入下游即可进入相关java进程
如下图
红色方框表示 java 进程ID,如上图
默认30分钟后会自动退出session
常用命令及操作
dashboard-查看进程面板
memory-查看内存使用情况
jvm-查看JVM使用情况
MACHINE-NAME |
机器名称 |
JVM-START-TIME |
JVM开始时间 |
MANAGEMENT-SPEC-VERSION |
管理规范版本 |
SPEC-NAME |
规范名称 |
SPEC-VENDOR |
规范供应商 |
SPEC-VERSION |
规范版本 |
VM-NAME |
虚机供应商 |
VM-VENDOR |
虚机供应商 |
VM-VERSION |
虚机版本 |
INPUT-ARGUMENTS |
输入编码 |
CLASS-PATH |
CLASS路径 |
BOOT-CLASS-PATH |
引导类路径 |
LIBRARY-PATH |
Jar库路径 |
CLASS-LOADING |
类加载 |
LOADED-CLASS-COUNT |
加载类计数 |
TOTAL-LOADED-CLASS-COUNT |
总加载类计数 |
UNLOADED-CLASS-COUNT |
未加载类计数 |
IS-VERBOSE |
是否详细 |
GARBAGE-COLLECTORS |
垃圾回收器 |
PS Scavenge |
PS清除 |
PS MarkSweep |
PS 标记清除 |
MEMORY-MANAGERS |
内存管理器 |
CodeCacheManager |
代码缓存管理器 |
Metaspace Manager |
元空间管理器 |
HEAP-MEMORY-USAGE |
堆内存使用情况 |
NO-HEAP-MEMORY-USAGE |
非堆内存使用情况 |
PENDING-FINALIZE-COUNT |
等待完成数 |
OPERATING-SYSTEM |
操作系统 |
THREAD -> COUNT |
JVM当前活跃的线程数 |
THREAD -> DAEMON-COUNT |
JVM当前活跃的守护线程数 |
THREAD -> PEAK-COUNT |
从JVM启动开始曾经活着的最大线程数 |
THREAD -> STARTED-COUNT |
从JVM启动开始总共启动过的线程次数 |
THREAD -> DEADLOCK-COUNT |
JVM当前死锁的线程数 |
FILE-DESCRIPTOR |
文件描述符 |
MAX-FILE-DESCRIPTOR-COUNT |
JVM进程最大可以打开的文件描述符数 |
OPEN-FILE-DESCRIPTOR-COUNT |
JVM当前打开的文件描述符数 |
sysprop-查看,修改系统参数
sun.desktop awt.toolkit file.encoding.pkg java.specification.version sun.cpu.isalist sun.jnu.encoding java.class.path java.vm.vendor sun.arch.data.model user.variant java.vendor.url user.timezone os.name java.vm.specification.version user.country sun.java.launcher sun.boot.library.path sun.java.command sun.cpu.endian user.home user.language java.specification.vendor java.home file.separator line.separator java.vm.specification.vendor java.specification.name java.awt.graphicsenv sun.boot.class.path user.script sun.management.compiler java.runtime.version user.name path.separator os.version java.endorsed.dirs java.runtime.name file.encoding java.vm.name java.vendor.url.bug java.io.tmpdir java.version user.dir os.arch java.vm.specification.name java.awt.printerjob sun.os.patch.level java.library.path java.vm.info java.vendor java.vm.version java.ext.dirs sun.io.unicode.encoding java.class.version |
sysprop查看所有系统属性
sysprop key 查看单个系统属性
sysprop key value 修改单个系统属性
sysenv-查看当前JVM的环境属性
sysenv 查看所有jvm环境变量
sysenv key 查看单个jvm环境变量
vmoption 查看,更新jvm参数
HeapDumpBeforeFullGC HeapDumpAfterFullGC HeapDumpOnOutOfMemoryError HeapDumpPath CMSAbortablePrecleanWaitMillis CMSWaitDuration CMSTriggerInterval PrintGC PrintGCDetails PrintGCDateStamps PrintGCTimeStamps PrintGCID PrintClassHistogramBeforeFullGC PrintClassHistogramAfterFullGC PrintClassHistogram MinHeapFreeRatio MaxHeapFreeRatio PrintConcurrentLocks UnlockCommercialFeatures |
在FullGC前生产dump文件 在FullGC后生产dump文件 在oom异常时生成dump文件 指定dump文件路径 CMS可采用预清除等待时间毫秒 CMS间隙等待时间 CMS 触发间隔 打印GC日志 打印GC详情 打印GC日志时间戳 打印此次垃圾回收距离jvm开始运行的所耗时间 打印GCID 在FullGC前将内存中的对象以日志的形式输出 在FullGC后将内存中的对象以日志的形式输出 遇到 Ctrl-Break 后打印类实例的柱状信息 空闲堆空间最小占比 空闲堆空间最大占比 遇到Ctrl-Break后打印并发锁的相关信息 解锁商业功能 |
vmoption 查看所有JVM参数
vmoption key 查看单个jvm参数
vmoption key value 修改jvm属性信息
classLoader 查看classloader的继承树,urls,类加载信息
classLoader -l 查看类加载实例统计数据
classLoader -t 查看类加载器树形结构
classLoader -c hashcode 查看加载器加载jar的urls
jad 反编译指定已加载类的源码
jad .class 查看反编译源码,包含classLoader,重新编译.class
jad --source-only .class 查看只源码不显示classLoader
jad --source-only .class method --lineNumber false
查看某方法源码不显示行号
sc 查看jvm类加载信息
sc -d class 查看类属性信息
下图红框为类加载器
sc -d -f class 查看类信息,属性信息
sc -d class |grep key 查看某个类属性信息
mc 将.java文件编译成 .class 文件
mc xxx.java -d path 指定文件编译保存地址
mc -c hashcode xxx.java -d path 指定类加载器编译
retransform 加载外部的.class文件,覆盖jvm已加载的类
retransform path 指定重新加载外部.class文件
retransform的限制
- 不允许新增加field/method
- 正在跑的函数,没有退出不能生效,如下图mian()不生效,test()生效
- 重复多次加载同一个 .class 文件 id最大生效
retransform -l 统计所有重新加载 .class文件
retransform -d id编号 删除重载的.class文件 -d ID编号 retransform --deleteAll 删除全部
retransform --classPattern xxx.class 文件 重新回复编译文件
watch java方法执行数据观测
注:
观察表达式, 返回时的 {参数, this对象, 返回值}
观察表达式,默认值是{params, target, returnObj}
-x 查看层级,-n 查看次数
watch class method 实时查看指定类的方法入参和出参,持续打印结果
实时查看耗时大于10毫秒数据,查看一次展示5层级参数
watch class method "{params,returnObj,throwExp}" '#cost>10' -x 5 -n 1
实时查看耗时大于10毫秒且第一个数据等于1的数据,查看一次展示5层级参数
watch class method "{params,returnObj,throwExp}" '#cost>10 && params[0]==1' -x 5 -n 1
实时查看第一个数据大于1且第二个数据等于“hello”的数据,查看一次展示5层级参数
watch class method "{params,returnObj,throwExp}" 'params[0]>1 && params[1]=="hello"' -x 5 -n 1
实时查看第一个数据小于5或者 第二个数据等于“world”的数据,查看一次展示5层级参数
watch *.CommonTest test "{params,returnObj,throwExp}" 'params[0]<5 || params[1]=="wolrd"' -x 5 -n 1
trace 方法内部调用路径及耗时
trace class method 查看指定类调用链及耗时
ts=2022-04-22 15:24:01; 系统执行时间
thread_name=main;id=1; 线程名称,线程ID
is_daemon=false;priority=5; 是否守护线程,权重
TCCL=sun.misc.Launcher$AppClassLoader@18b4aac2 类加载器
`---[0.1172ms] fills.arthas.ArthasTest:test() 执行时间
stack 输出当前方法被调用的调用路径
stack class method 查看指定类方法所有调用路径
ts=2022-04-22 15:37:02; 系统执行时间
thread_name=main;id=1; 线程名称,线程ID
is_daemon=false;priority=5; 是否守护线程,权重
TCCL=sun.misc.Launcher$AppClassLoader@18b4aac2 类加载器
@fills.arthas.ArthasTest.test()
at fills.arthas.ArthasTest.main(ArthasTest.java:9) 调用链
ognl 调用静态属性和方法
1.查看静态属性
ognl ‘@全路经类名@属性字段’ -x 1 查看字段一级属性值
2.查看静态方法
ognl ‘@全路经类名@方法名称(xx,xx)’ -x 1 调用静态方法查看一级返回值; 2,3查看二,三级参数
案例场景应用
调用链接口新性能损耗分析
trace class method 实时抓取调用类方法请求及调用链处理时耗
注trace 每次只能查看一级链路耗时情况
trace com.ddky.top.meituan.web.controller.product.ProductManageController
listProductMapping
从调用链耗时情况可以看出是在调用dubbo服务耗时最多
+---[227.5465ms] com.ddky.top.meituan.service.ProductManageService:listProductManage() #140
trace com.ddky.top.meituan.service.ProductManageService listProductManage
+---[19.0228ms] com.ddky.top.meituan.data.dao.ProductManageDao:countProductMapping() #128
+---[9.3109ms] com.ddky.top.meituan.data.dao.ProductManageDao:listProductMapping() #132
+---[79.1293ms] com.ddky.top.inner.api.service.InnerProductClient:getPageFromCondition() #167
调用外部dubbo耗时
+---[63.7842ms] com.ddky.top.meituan.service.ProductPriceService:newReadBatchGetTopPrice() #171
循环内部接口调用耗时
从上图看出主要耗时地方有2处
建议优化方案
调用外部dubbo接口异步处理
调用内部循环调用改为批量查询
在线修改源码并热发布迅速解决线上问题
原有逻辑操作
- jad --source-only .class --lineNumber false > xxx.java 打印源码到指定文件
- vi xxx.java 修改源码
- sc .class |grep classLoaderHash 查看源码类加载器hashcode
- mc -c hashcode .java -d path 生成新的.class 文件
注(1-4步)可以线下生成class文件上传线上服务器,复杂的类编译很容易出错,不建议
5.retransform class 重新加载类文件
6.jad class 或者 retransform --classPattern class 重新加载源class文件复原线上环境
在线查看修改静态方法及属性值
1.查看线上静态配置属性
ognl ‘@全路经类名@属性字段’ -x 1 查看字段一级属性值
2.调用线上静态方法
ognl ‘@全路经类名@方法名称(xx,xx)’ -x 1 调用静态方法查看一级返回值
3.修改静态属性变量
ognl ‘@全路经类名@方法名称(xxx)’ 注: 该方法内部未修改属性
修改日志等级
1.logger --name ROOT --level debug 修改日志等级为debug
2. logger -c 2a139a55 --name ROOT --level debug 指定classloader更新日志等级为debug
略
还有其他运维场景比如修改jvm,系统环境参数,查看线上线程内存使用情况
Arthas在线诊断工具使用相关推荐
- 阿里巴巴arthas诊断工具使用介绍
阿里推出的arthas诊断工具,是专门针对Java程序出现内存泄漏,CPU使用过高,线上问题运行错误进行诊断的工具.它的运行很简单,只需要下载一个arthas-boot.jar的工具包,然后通过jav ...
- 「技术工具」阿里开源Java在线诊断工具 Arthas 进阶教程
Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱. 本教程会以一个普通的Spring Boot应用为例,演示Arthas命令的详细用法. Github: https://githu ...
- 架构师小跟班:推荐一款Java在线诊断工具,arthas入门及使用教程
安装 官方网站: https://alibaba.github.io/arthas/index.html 一.下载arthas-boot.jar,然后用java -jar的方式启动: wget htt ...
- Arthas诊断工具(二)jadmcredefine命令
官网Arthas Install - Arthas 3.5.6 文档 开源地址:https://github.com/alibaba/arthas 官方文档:https://alibaba.githu ...
- arthas 排查内存溢出_Java 应用线上问题排查思路、常用工具小结
前言 本文总结了一些常见的线上应急现象和对应排查步骤和工具.分享的主要目的是想让对线上问题接触少的同学有个预先认知,免得在遇到实际问题时手忙脚乱.毕竟作者自己也是从手忙脚乱时走过来的. 只不过这里先提 ...
- Arthas使用教程 阿里巴巴开源项目、史上最强java线上诊断工具
什么是 Arthas 摘录一段官方 Github 上的简介 Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱. 当你遇到以下类似问题而束手无策时,Arthas 可以帮助你解决: 这 ...
- 这四个问题场景你会排查原因吗?看看高手是如何使用 Arthas 快速定位原因的!...
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 张奇(司楚) 当线上碰到头疼的问题时,还在对着 ...
- gateway 内存溢出问题_带你学习jvm java虚拟机 arthas/性能调优/故障排除/gc回收/内存溢出等...
学完本课程,您将掌握: 内存溢出问题实战 CPU飙升问题实战 阿里巴巴Arthas在线诊断 Class字节详细拆解 手写类加载器.四种类加载器.双亲委托模型 对象创建.存储.访问.加载解析 性能调优. ...
- java线上排查利器arthas
当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 commit?分支 ...
最新文章
- 你的企业在什么情况下需要人工智能?快来看看你需要具备哪些条件与能力吧!...
- C++知识点8——函数的返回值
- java makedir用法_Java Files.makeDir方法代码示例
- c语言编一个开关量上升沿的程序,电工学(1)习题解答
- 期货大赛项目|八,ueditor的应用
- Pyqt5转化.ui文件到.py文件
- 小编带着小白看springboot源码2
- hessian无法获取连接_PPPoE拨号设置完成后无法上网解决方法【详解】
- 字典树(Trie树)的实现及应用
- 该怎么把光纤接入家里预埋的网线中?
- 数字逻辑:时序逻辑元件——锁存器
- 老年人智能手机APP开发界面设计因素
- 点、圆、圆柱类的设计
- 《初入linux》--第二十部分-Apache服务器的几个实用技巧
- 分布式游戏服务器通用架构的设计
- TensorRT报Cuda initialization failure with error
- 5G 和 WiFi-6,谁是智能制造的主角?
- 泛微oa流程表单之请假单(判断请假结束时间不能小于等于请假开始时间)
- CPU、GPU的设计工作原理
- php字符串分隔函数,php字符串分割函数的简单示例
热门文章
- 产品读书《极简管理法则》
- 关于单帧,首帧,流控帧,连续帧
- 使用esp32cam与stm32c8t6核心板开发的99A静改动
- UnityEditor查找引用和批量替换资源工具
- 世界500强名称中英对照1-100名单
- Ubuntu 18.04 安装ns-3.30
- Dew Lab Studio
- vue 动态获取的图片路径不显示_Vue 动态图片加载路径问题和解决方法
- c#飞行棋游戏(控制台)
- Re38:读论文 NeurJudge: A Circumstance-aware Neural Framework for Legal Judgment Prediction