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的限制

  1. 不允许新增加field/method
  2. 正在跑的函数,没有退出不能生效,如下图mian()不生效,test()生效
  3. 重复多次加载同一个 .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接口异步处理

调用内部循环调用改为批量查询

在线修改源码并热发布迅速解决线上问题

原有逻辑操作

  1. jad  --source-only  .class  --lineNumber false  >  xxx.java  打印源码到指定文件
  2. vi xxx.java 修改源码
  3. sc  .class  |grep classLoaderHash  查看源码类加载器hashcode
  4. 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在线诊断工具使用相关推荐

  1. 阿里巴巴arthas诊断工具使用介绍

    阿里推出的arthas诊断工具,是专门针对Java程序出现内存泄漏,CPU使用过高,线上问题运行错误进行诊断的工具.它的运行很简单,只需要下载一个arthas-boot.jar的工具包,然后通过jav ...

  2. 「技术工具」阿里开源Java在线诊断工具 Arthas 进阶教程

    Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱. 本教程会以一个普通的Spring Boot应用为例,演示Arthas命令的详细用法. Github: https://githu ...

  3. 架构师小跟班:推荐一款Java在线诊断工具,arthas入门及使用教程

    安装 官方网站: https://alibaba.github.io/arthas/index.html 一.下载arthas-boot.jar,然后用java -jar的方式启动: wget htt ...

  4. Arthas诊断工具(二)jadmcredefine命令

    官网Arthas Install - Arthas 3.5.6 文档 开源地址:https://github.com/alibaba/arthas 官方文档:https://alibaba.githu ...

  5. arthas 排查内存溢出_Java 应用线上问题排查思路、常用工具小结

    前言 本文总结了一些常见的线上应急现象和对应排查步骤和工具.分享的主要目的是想让对线上问题接触少的同学有个预先认知,免得在遇到实际问题时手忙脚乱.毕竟作者自己也是从手忙脚乱时走过来的. 只不过这里先提 ...

  6. Arthas使用教程 阿里巴巴开源项目、史上最强java线上诊断工具

    什么是 Arthas 摘录一段官方 Github 上的简介 Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱. 当你遇到以下类似问题而束手无策时,Arthas 可以帮助你解决: 这 ...

  7. 这四个问题场景你会排查原因吗?看看高手是如何使用 Arthas 快速定位原因的!...

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 张奇(司楚) 当线上碰到头疼的问题时,还在对着 ...

  8. gateway 内存溢出问题_带你学习jvm java虚拟机 arthas/性能调优/故障排除/gc回收/内存溢出等...

    学完本课程,您将掌握: 内存溢出问题实战 CPU飙升问题实战 阿里巴巴Arthas在线诊断 Class字节详细拆解 手写类加载器.四种类加载器.双亲委托模型 对象创建.存储.访问.加载解析 性能调优. ...

  9. java线上排查利器arthas

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

最新文章

  1. 你的企业在什么情况下需要人工智能?快来看看你需要具备哪些条件与能力吧!...
  2. C++知识点8——函数的返回值
  3. java makedir用法_Java Files.makeDir方法代码示例
  4. c语言编一个开关量上升沿的程序,电工学(1)习题解答
  5. 期货大赛项目|八,ueditor的应用
  6. Pyqt5转化.ui文件到.py文件
  7. 小编带着小白看springboot源码2
  8. hessian无法获取连接_PPPoE拨号设置完成后无法上网解决方法【详解】
  9. 字典树(Trie树)的实现及应用
  10. 该怎么把光纤接入家里预埋的网线中?
  11. 数字逻辑:时序逻辑元件——锁存器
  12. 老年人智能手机APP开发界面设计因素
  13. 点、圆、圆柱类的设计
  14. 《初入linux》--第二十部分-Apache服务器的几个实用技巧
  15. 分布式游戏服务器通用架构的设计
  16. TensorRT报Cuda initialization failure with error
  17. 5G 和 WiFi-6,谁是智能制造的主角?
  18. 泛微oa流程表单之请假单(判断请假结束时间不能小于等于请假开始时间)
  19. CPU、GPU的设计工作原理
  20. php字符串分隔函数,php字符串分割函数的简单示例

热门文章

  1. 产品读书《极简管理法则》
  2. 关于单帧,首帧,流控帧,连续帧
  3. 使用esp32cam与stm32c8t6核心板开发的99A静改动
  4. UnityEditor查找引用和批量替换资源工具
  5. 世界500强名称中英对照1-100名单
  6. Ubuntu 18.04 安装ns-3.30
  7. Dew Lab Studio
  8. vue 动态获取的图片路径不显示_Vue 动态图片加载路径问题和解决方法
  9. c#飞行棋游戏(控制台)
  10. Re38:读论文 NeurJudge: A Circumstance-aware Neural Framework for Legal Judgment Prediction