Arthas 使用实践

2023-11-04

1、Arthas

Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。

2、学习总结

2.1、所有环境都在线上,学习时不用自己搭环境

官方在线学习教程

2.2、官方文档

具体命令中文文档

2.3、相关参考博文

介绍博文

远程连接 jvm

arthas tunnel server 模式,运行在服务器上的 server, 通过本地输入 agentId 连接。

2.4、idea arthas 插件

idea 插件介绍
idea 插件文档

3、各种捣腾

3.1、Arthas 下载使用

离线安装文章
直接下载使用

curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar

启动后可以直接查看 JVM 里运行的程序
在这里插入图片描述
在这里插入图片描述

3.2、支持管道操作

sc -d *MathGame | grep Math

3.3、基础命令

  • sc, 搜索类,可以全限定名或者通配符,根据定位出来的结果,找到对应的类。

    sc -d *MathGame
    
  • jad, 反编译代码,可以直接查看,定位结果后,直接反编译初略地找下问题。

    jad demo.MathGame
    
  • watch, 监控各个方法使用时长

    watch <类名> <方法名> returnObj
    watch demo.MathGame primeFactors returnObj
    watch com.sample getUserName '{params,returnObj,throwExp}'  -n 5  -x 1
    

    在这里插入图片描述

  • 退出使用 exit 或者 quit,只能退出当前 session, 再次进入需要再执行一次 java 命令。 想要结束 server, 需要进入之后 stop

    java -jar arthas-boot.jar
    
  • vmtool (since 3.5.1)
    可参考堆栈中对象的信息

    vmtool --action getInstances --className org.apache.catalina.session.StandardManager --express 'instances[1].sessions' -x 2
    

3.4、进阶命令

  • sysprop 可以打印所有的System Properties信息,添加,查看 key 值

  • sysenvsysprop 类型

  • jvm

  • dashboard 实时监控页面

  • help 查看帮助文档

  • Tab 自动补全

  • keymap 查看快捷键信息, 如: Ctrl + A 行首, Ctrl + E 行尾

  • pipeline, 即 |, 如:sysprop | grep java

  • sc 查找类
    查看 classLoader

    sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash
    

    指定 classLoader
    ognl -c 1be6f5c3
    ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader

  • sm 查找函数
    sm命令则是查找类的具体函数。比如:

    sm java.math.RoundingMode
    

    通过-d参数可以打印函数的具体属性:

    sm -d java.math.RoundingMode
    

    也可以查找特定的函数,比如查找构造函数:

    sm java.math.RoundingMode <init>
    
  • Ognl 动态执行代码, 通过 arthas 执行代码, 可以在运行的 jar 里面执行, 应该是通过字节码增强技术实现。
    如:ognl '@java.lang.System@out.println("hello ognl")' 执行后,在目标进程里可以查看到日志: hello ognl。
    特殊用法参考
    官方指南

  • 热更新代码:jad -> mc -> redefine

  • tt即 TimeTunnel,它可以记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测。

    tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod
    
  • trace使用 ognl 表达式过滤
    trace *StringUtils isBlank '#cost>100'表示当执行时间超过100ms的时候,才会输出trace的结果。

4 idea arthas plugin 配合远程使用

Arthas 远程连接有两种,一种是使用 web consol, 另外一种是使用 Http Api

4.1、 安装idea arthas 插件

选择需要查看的方法或类,右键打开,选择 Arthas Command, 自动生成需要的命令,如:tt -t xxx.HttpTestController post -n 5 '1==1', 这个是这个插件自动生成的。
在这里插入图片描述

4.2、 安装 arthas tunnel server/client

官方安装文档

  1. 下载部署arthas tunnel server

  2. 默认情况下,arthas tunnel server的web端口是8080,arthas agent连接的端口是7777

    java -jar arthas-tunnel-server-3.4.5-fatjar.jar --server.port=8888
    
  3. 启动 arthas 客户端, 并注册到 arthas-tunnel-server, 注册 agent 需要使用 7777 端口

    java -jar arthas-boot.jar --tunnel-server 'ws://127.0.0.1:7777/ws' --agent-id test
    

    启动时会要求选择 PID , 这个 PID 就是此次启动的 agent 注册到 server 的 agent-id.

  4. 使用 web 页面
    agentId 就是启动 client 时设置的 test
    在这里插入图片描述

  5. 登陆 http://<实际 IP 地址 不能填127>:8888/actuator/arthas 查看 agentId 注册信息,用户名 arthas, 密码在启动时生成。
    在这里插入图片描述
    登陆后显示结果
    在这里插入图片描述

  6. 配合 idea arthas 插件使用, web console 不能黏贴,只适合开发阶段使用

4.3、Http API

http api 适合定时抓取信息, 如使用 shell 脚本或者使用代码进行开发, 做自己的监控。Http Api 是针对 client 端的访问,也就是 arthas-boot.jar, 每次只能指定一个应用。
简单的使用方式:获取 arthas 版本信息

curl -X POST -i 'http://127.0.0.1:8563/api' --data '{
  "action":"exec",
  "command":"version"
}'

其他例子看http api 官网

4.4、async-profiler生成火焰图

目前只支持 linux/mac,相关排查文章
图片来源https://www.cnblogs.com/alisystemsoftware/p/13596262.html

5、总结

arthas 的目的是做监控,因此都是在必要时使用, 没必要一直运行。
远程连接到 arthas 有两种方法: 1 启动一个服务端,每个客户端注册到服务端上,通过 web console 访问。2. 直连客户端的 8563 端口,使用 http api 访问。
如果是在物理环境下,每次应用重启,arthas 都要重新绑定 PID, 如果通过 docker 部署就不用手动指定 PID。
使用 web console 方式,服务端可以常开, 客户端只有需要的时候才启动,减少资源浪费。
arthas 作为最后排查工具出现, 在监控环节需要另外的中间件提供信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Arthas 使用实践 的相关文章

  • 唯一索引或主键违规:“PRIMARY KEY ON PUBLIC.xxx”; SQL语句

    每当我的应用程序启动时 我都会收到以下错误消息 Caused by org h2 jdbc JdbcSQLException Unique index or primary key violation PRIMARY KEY ON PUBL
  • 如何在 JFace 的 TableViewer 中创建复选框?

    我创建了一个包含两列的 tableViewer 我想将其中一列设为复选框 为此 我创建了一个 CheckBoxCellEditor 但我不知道为什么它不起作用 名为 tableName 的列显示其值正常 色谱柱规格如下 String COL
  • Java程序中的数组奇怪的行为[重复]

    这个问题在这里已经有答案了 我遇到了这个 Java 程序及其以意想不到的方式运行 以下程序计算 int 数组中元素对之间的差异 import java util public class SetTest public static void
  • 如何测试 JUnit 测试的 Comparator?

    我需要测试 Compare 方法 但我对如何测试感到困惑 我可以看看该怎么做吗 public class MemberComparator implements Comparator
  • 如何查找 Android 设备中的所有文件并将它们放入列表中?

    我正在寻求帮助来列出 Android 外部存储设备中的所有文件 我想查找所有文件夹 包括主文件夹的子文件夹 有办法吗 我已经做了一个基本的工作 但我仍然没有得到想要的结果 这不起作用 这是我的代码 File files array file
  • 在浏览器中点击应用程序时播放框架挂起

    我正在 Play 中运行一个应用程序activator run 也许 5 次中有 3 次 它会挂起 当我去http localhost 9000 它就永远坐在那里旋转 我看到很多promise timed out错误也 我应该去哪里寻找这个
  • 使用 ANTLR 为 java 源代码生成抽象语法树

    如何使用 ANTLR 从 java src 代码生成 AST 有什么帮助吗 好的 步骤如下 前往ANTLR站点 http www antlr org 并下载最新版本 下载Java g和JavaTreeParser g文件来自here htt
  • 如何在 Java 中禁用 System.out 以提高速度

    我正在用 Java 编写一个模拟重力的程序 其中有一堆日志语句 到 System out 我的程序运行速度非常慢 我认为日志记录可能是部分原因 有什么方法可以禁用 System out 以便我的程序在打印时不会变慢 或者我是否必须手动检查并
  • 序列化对象以进行单元测试

    假设在单元测试中我需要一个对象 其中所有 50 个字段都设置了一些值 我不想手动设置所有这些字段 因为这需要时间而且很烦人 不知何故 我需要获得一个实例 其中所有字段都由一些非空值初始化 我有一个想法 如果我要调试一些代码 在某个时候我会得
  • 如何将文件透明地传输到浏览器?

    受控环境 IE8 IIS 7 ColdFusion 当从 IE 发出指向媒体文件 例如 mp3 mpeg 等 的 GET 请求时 浏览器将启动关联的应用程序 Window Media Player 我猜测 IIS 提供文件的方式允许应用程序
  • Spring Data 与 Spring Data JPA 与 JdbcTemplate

    我有信心Spring Data and Spring Data JPA指的是相同的 但后来我在 youtube 上观看了一个关于他正在使用JdbcTemplate在那篇教程中 所以我在那里感到困惑 我想澄清一下两者之间有什么区别Spring
  • 归并排序中的递归:两次递归调用

    private void mergesort int low int high line 1 if low lt high line 2 int middle low high 2 line 3 mergesort low middle l
  • Java中未绑定通配符泛型的用途和要点是什么?

    我不明白未绑定通配符泛型有什么用 具有上限的绑定通配符泛型 stuff for Object item stuff System out println item Since PrintStream println 可以处理所有引用类型 通
  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • Windows 上的 Nifi 命令

    在我当前的项目中 我一直在Windows操作系统上使用apache nifi 我已经提取了nifi 0 7 0 bin zip文件输入C 现在 当我跑步时 bin run nifi bat as 管理员我在命令行上看到以下消息 但无法运行
  • 运行 Jar 文件时出现问题

    我已将 java 项目编译成 Jar 文件 但运行它时遇到问题 当我跑步时 java jar myJar jar 我收到以下错误 Could not find the main class myClass 类文件不在 jar 的根目录中 因
  • Springs 元素“beans”不能具有字符 [children],因为该类型的内容类型是仅元素

    我在 stackoverflow 中搜索了一些页面来解决这个问题 确实遵循了一些正确的答案 但不起作用 我是春天的新人 对不起 这是我的调度程序 servlet
  • 查看Jasper报告执行的SQL

    运行 Jasper 报表 其中 SQL 嵌入到报表文件 jrxml 中 时 是否可以看到执行的 SQL 理想情况下 我还想查看替换每个 P 占位符的值 Cheers Don JasperReports 使用 Jakarta Commons
  • android Accessibility-service 突然停止触发事件

    我有一个 AccessibilityService 工作正常 但由于开发过程中的某些原因它停止工作 我似乎找不到这个原因 请看一下我的代码并告诉我为什么它不起作用 public class MyServicee extends Access
  • 中断连接套接字

    我有一个 GUI 其中包含要连接的服务器列表 如果用户单击服务器 则会连接到该服务器 如果用户单击第二个服务器 它将断开第一个服务器的连接并连接到第二个服务器 每个新连接都在一个新线程中运行 以便程序可以执行其他任务 但是 如果用户在第一个

随机推荐

  • Camera和Image sensor技术基础笔记(5) -- HDR相关技术

    动态范围 Dynamic Range 动态范围最早是信号系统的概念 一种信号系统的动态范围定义为 最大的信号不失真的电平和噪声电平的差 在实际场景中 多用分贝 dB 为单位来衡量一个信号系统的动态范围 以上说法可能有些抽象 来看两个例子 1
  • ggplot2读书笔记2:ggplot()的基本用法以及如何绘制几何对象

    Getting Started with ggplot2 ggplot 基本用法 由ggplot2所制得图形有三个重要的组成部分 1 数据 2 数据和视觉变量属性之间的映射 aesthetic mappings 3 呈现数据结果的图层 一般
  • JS中的prototype

    JS中的phototype是JS中比较难理解的一个部分 本文基于下面几个知识点 1 原型法设计模式 在 Net中可以使用clone 来实现原型法 原型法的主要思想是 现在有1个类A 我想要创建一个类B 这个类是以A为原型的 并且能进行扩展
  • 绝地救生error_30种面向前端开发人员的救生工具

    绝地救生error As the functionalities of web apps keep getting ever more sophisticated and complex web developers need flexib
  • 【2】数据湖架构中 Iceberg 的核心特性

    在业界的数据湖方案中有 Hudi Iceberg 和 Delta 三个关键组件可供选择 一 Iceberg 是什么 Iceberg 官网中是这样定义的 Apache Iceberg is an open table format for h
  • JS封装计算1~100之间所有整数的总和与平均值

    function getSum var sum 0 for i 0 i lt 100 i sum i console log 1 100所有数和为 sum console log 1 100所有数和的平均值为 sum 100 getSum
  • Intellij idea 导入 jdbc

    第一步 去官网https dev mysql com downloads connector j 下载驱动程序 第二步 解压压缩包 记住路径 第三步 打开你的idea工程 打开Project Structure Modules gt gt
  • RabbitMQ - 死信、TTL原理、延迟队列安装和配置

    目录 一 死信交换机 1 1 什么是死信交换机 1 2 TTL 1 2 1 什么是 TTL 1 2 2 通过 TTL 模拟触发死信 二 延迟队列 2 1 什么是延迟队列 2 2 配置延迟队列插件 2 2 1 延迟队列配置 a 下载镜像 b
  • pyhive报错Could not start SASL: b‘Error in sasl_client_start (-4) SASL(-4)

    python3连接hive 1 安装对应依赖 2 连接hive 3 常见报错 1 安装对应依赖 pip install sasl pip install thrift pip install thrift sasl pip install
  • 快速上手Cruisecontrol

    1 Cruisecontrol的概述 CruiseControl是一种持续集成过程的框架 包括了邮件通知 ant和各种源码控制工具的插件 并提供web接口 用于查看当前和以前的build的结果 2 Cruisecontrol的安装 2 1
  • windows下免费本地部署类ChatGpt的国产ChatGLM-6B

    ChatGLM 6B 是一个开源的 支持中英双语的对话语言模型 基于 General Language Model GLM 架构 具有 62 亿参数 结合模型量化技术 用户可以在消费级的显卡上进行本地部署 INT4 量化级别下最低只需 6G
  • 万字长文,SpringSecurity

    思维导图如下 RBAC权限分析 RBAC 全称为基于角色的权限控制 本段将会从什么是RBAC 模型分类 什么是权限 用户组的使用 实例分析等几个方面阐述RBAC 思维导图 绘制思维导图如下 什么是RBAC RBAC 全称为用户角色权限控制
  • javascript算法之数组反转浅谈

    本文主要介绍了javascript算法之数组反转 文章围绕主题展开详细的内容介绍 具有一定的参考价值 需要的小伙伴可以参考一下 1 数组反转 1 1 leecode题目 旋转数组 给你一个数组 将数组中的元素向右轮转 k 个位置 其中 k
  • Servlet是不是线程安全的?

    首先在servlet中的方法 三个重要方法 1 init 进行资源的加载 2 service 处理请求 根据请求方式 调用doGet或者doPost 3 destroy 进行资源的释放 servlet是单实例的 假如在处理请求时候 多线程访
  • AcWing 104. 货仓选址

    题目 在一条数轴上有 N 家商店 它们的坐标分别为 A1 AN 现在需要在数轴上建立一家货仓 每天清晨 从货仓到每家商店都要运送一车商品 为了提高效率 求把货仓建在何处 可以使得货仓到每家商店的距离之和最小 输入格式 第一行输入整数N 第二
  • windows下访问linux下的文件,【IT之家学院】如何从Win10访问Linux子系统中的文件 - IT之家...

    在19H1 目前处于Insider Preview阶段 预计4月份正式推送 中 微软为适用于Linux的Windows子系统带来了一项有趣的功能 这项功能允许用户从Windows 10访问Linux子系统中的文件 今天的这期教程 我们来讨论
  • AppScan 漏扫工具-保姆及配置使用说明

    本文章仅供学习使用 严禁在未经网站管理员的允许的条件下扫描任何网站 工具的滥用违反国家安全法后果自负 申明 本文实验环境在内网中进行 网站为自己服务器所搭建的sqli labs DVWA master测试网站 1 AppScan安装和基础配
  • 请分别创建出listA、listB、listC,完成以下各题 (1)将listC中的内容添加到listB中: (2)输出listA与listB的交集listD; (3)输出listA与listB的并集...

    答 1 将listC中的内容添加到listB中 将listC中的每一项元素都添加到listB尾部 2 输出listA与listB的交集listD 定义一个空listD 遍历listA中的每个元素 如果listB中有相同的元素 则将该元素加入
  • 爬虫碰到状态码412的解决办法

    爬虫碰到状态码412 近期在使用python的requests库爬取网页时 碰到返回状态码为412的情况 状态码412含义为 Precondition Failed 服务器在验证在请求的头字段中给出先决条件时 没能满足其中的一个或多个 这个
  • Arthas 使用实践

    文章目录 1 Arthas 2 学习总结 2 1 所有环境都在线上 学习时不用自己搭环境 2 2 官方文档 2 3 相关参考博文 2 4 idea arthas 插件 3 各种捣腾 3 1 Arthas 下载使用 3 2 支持管道操作 3