非常好用的Java诊断工具Arthas(阿尔萨斯)

小伙伴们好,欢迎关注,一起学习,无限进步

文章目录

    • Window 安装
    • Linux 安装
    • SpringBoot 整合 arthas
    • 其他使用场景

Arthas是阿里巴巴开源的一款Java诊断工具,可以用于线上诊断问题、监控应用性能等。支持 Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,本文将介绍Arthas的安装、常用命令以及一个简单的使用示例。

当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

  1. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  2. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  3. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  4. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  5. 是否有一个全局视角来查看系统的运行状况?
  6. 有什么办法可以监控到JVM的实时运行状态?
  7. 怎么快速定位应用的热点,生成火焰图?

官方文档:https://arthas.aliyun.com/

Window 安装

GitHub下载安装:https://github.com/alibaba/arthas/releases

下载 arthas-bin.zip 压缩包,或者使用命令下载 arthas-boot.jar

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

windows 指定文件夹在解压,进入 arthas-boot.jar 文件所在的目录下,使用 cmd 控制面板打开,运行 java -jar arthas-boot.jar 命令,出现以下内容,选择对象项目运行进程的编号【4】

D:\environment\arthas-bin>java -jar arthas-boot.jar
[INFO] JAVA_HOME: D:\tools\Java\jdk1.8.0_291\jre
[INFO] arthas-boot version: 3.7.2
[INFO] Process 16964 already using port 3658
[INFO] Process 16964 already using port 8563
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 16964 org.jetbrains.jps.cmdline.Launcher
  [2]: 33188 org.jetbrains.idea.maven.server.RemoteMavenServer36
  [3]: 24952 org.jetbrains.idea.maven.server.RemoteMavenServer36
  [4]: 11548 com.ruoyi.RuoYiApplication
  [5]: 11788 org.jetbrains.idea.maven.server.RemoteMavenServer36
  [6]: 12380 org.jetbrains.idea.maven.server.RemoteMavenServer36
  [7]: 14972 org.jetbrains.jps.cmdline.Launcher
  [8]: 2892 org.jetbrains.idea.maven.server.RemoteMavenServer36
  [9]: 9324

常用命令列表可参考官方文档:命令列表

以下使用 trace 命令

  • trace - 方法内部调用路径,并输出方法路径上的每个节点上耗时

输入编号 4 运行成功截图

在这里插入图片描述

打开 IDEA 安装 arthas 插件,重启 IDEA
在这里插入图片描述

进入业务逻辑在方法名上右键,复制要执行追踪方法调用的命令

在这里插入图片描述

把以下命令粘贴到要执行 arthas 控制面板上,可以清楚的看到当前方法执行的事件,第几行代码花费的事件,

[arthas@20136]$ trace com.ruoyi.framework.web.service.SysLoginService login  -n 5 --skipJDKMethod false
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 272 ms, listenerId: 1
`---ts=2024-03-08 15:50:33;thread_name=http-nio-8080-exec-2;id=76;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@24e00a46
    `---[474.7417ms] com.ruoyi.framework.web.service.SysLoginService:login()
        +---[2.61% 12.4108ms ] com.ruoyi.system.service.ISysConfigService:selectCaptchaEnabled() #70
        +---[5.12% 24.2993ms ] com.ruoyi.framework.web.service.SysLoginService:validateCaptcha() #74
        +---[0.00% 0.0143ms ] org.springframework.security.authentication.UsernamePasswordAuthenticationToken:<init>() #80
        +---[0.00% 0.009ms ] com.ruoyi.framework.security.context.AuthenticationContextHolder:setContext() #81
        +---[73.01% 346.6275ms ] org.springframework.security.authentication.AuthenticationManager:authenticate() #83
        +---[0.00% 0.0183ms ] com.ruoyi.framework.security.context.AuthenticationContextHolder:clearContext() #100
        +---[0.00% 0.0111ms ] com.ruoyi.framework.manager.AsyncManager:me() #102
        +---[0.01% 0.0652ms ] com.ruoyi.common.utils.MessageUtils:message() #102
        +---[0.03% 0.1608ms ] com.ruoyi.framework.manager.factory.AsyncFactory:recordLogininfor() #102
        +---[0.10% 0.4626ms ] com.ruoyi.framework.manager.AsyncManager:execute() #102
        +---[0.01% 0.0275ms ] org.springframework.security.core.Authentication:getPrincipal() #103
        +---[0.00% 0.0127ms ] com.ruoyi.common.core.domain.model.LoginUser:getUserId() #104
        +---[6.09% 28.9135ms ] com.ruoyi.framework.web.service.SysLoginService:recordLoginInfo() #104
        +---[0.00% 0.0114ms ] java.lang.StringBuilder:<init>() #108
        +---[0.01% min=0.013ms,max=0.0156ms,total=0.0286ms,count=2] java.lang.StringBuilder:append() #108
        +---[0.00% 0.0115ms ] com.ruoyi.common.core.domain.model.LoginUser:getUser() #108
        +---[0.00% 0.0119ms ] com.ruoyi.common.core.domain.entity.SysUser:getUserId() #108
        +---[0.00% 0.0095ms ] java.lang.StringBuilder:toString() #108
        +---[2.48% 11.75ms ] com.ruoyi.common.core.redis.RedisCache:getCacheObject() #109
        +---[0.00% 0.0101ms ] com.ruoyi.common.utils.StringUtils:isNotEmpty() #110
        +---[2.57% 12.2048ms ] com.ruoyi.common.core.redis.RedisCache:deleteObject() #112
        +---[2.52% 11.9701ms ] com.ruoyi.common.core.redis.RedisCache:deleteObject() #113
        `---[5.29% 25.1361ms ] com.ruoyi.framework.web.service.TokenService:createToken() #117

当前命令说明:

trace com.ruoyi.framework.web.service.SysLoginService login  -n 5 --skipJDKMethod false 
  1. trace:表示要追踪方法调用。
  2. com.ruoyi.framework.web.service.SysLoginService login:表示要追踪的类和方法,这里是追踪com.ruoyi.framework.web.service.SysLoginService类中的login方法。
  3. -n 5:表示只追踪前5次方法调用。
  4. --skipJDKMethod false:表示不跳过JDK方法,即追踪JDK方法的调用。

Linux 安装

同理安装

下载

wget https://github.com/alibaba/arthas/releases/download/arthas-all-3.7.2/arthas-bin.zip

直接下载会比较慢,可以接下载 arthas-boot.jar

wget https://arthas.aliyun.com/arthas-boot.jar

运行 java -jar arthas-boot.jar ,和 window 上控制面板执行命令一样

SpringBoot 整合 arthas

SpringBoot 整合 arthas-spring-boot-starter,添加以下依赖

<dependency>
    <groupId>com.taobao.arthas</groupId>
    <artifactId>arthas-spring-boot-starter</artifactId>
    <version>3.7.2</version>
</dependency>

application.yml 添加配置文件

arthas:
  # telnetPort、httpPort为 -1 ,则不listen telnet端口,为 0 ,则随机telnet端口
  # 如果是防止一个机器上启动多个 arthas端口冲突。可以配置为随机端口,或者配置为 -1,并且通过tunnel server来使用arthas。
  # 通过http默认访问的端口
  http-port: 8563
  # 通过telnet默认访问的端口
  telnet-port: 3658
  session-timeout: 1800
  # 127.0.0.1只能本地访问,0.0.0.0则可网络访问,但是存在安全问题
  ip: 127.0.0.1
  appName: arthas_test
  # 默认情况下,会生成随机ID,如果 arthas agent配置了 appName,则生成的agentId会带上appName的前缀。
  agent-id: abcdefghijklmnopqrstuvwxyz
  # tunnel-server地址
  tunnel-server: ws://127.0.0.1:7777/ws

启动项目

访问:http://ip:8563/,出现以下页面则说明成功,根据 arthas 使用命令执行即可

在这里插入图片描述

其他使用场景

Arthas 的使用非常灵活,有时候甚至还会有一些意想不到的功能,除了上面这些使用场景,Arthas 的 Issues 中还收集了一些 用户案例,其中有几个案例对我印象很深,非常有启发性,可供参考。

使用 stack 命令定位 System.exit/System.gc 的调用来源:https://github.com/alibaba/arthas/issues/20

使用 sc 和 jad 排查 NoSuchMethodError 问题:https://github.com/alibaba/arthas/issues/160

使用 redefine 修改 StringBuilder.toString() 定位未知的日志来源:https://github.com/alibaba/arthas/issues/263

使用 trace javax.servlet.Servlet/Filter 排查 Spring Boot 应用 404/401 问题:https://github.com/alibaba/arthas/issues/429

使用 tt 定位 Java 应用 CPU 负载过高问题:https://github.com/alibaba/arthas/issues/1202

使用 profiler 做复杂链路分析,排查性能问题:https://github.com/alibaba/arthas/issues/1416

使用 trace 命令将接口性能优化十倍:https://github.com/alibaba/arthas/issues/1892

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【学习笔记】开源计算机视觉库OPENCV学习方案

本文中&#xff0c;我们试图提供一些学习OpenCV的详细和实用资源&#xff0c;这些资源包括基础知识、进阶技巧以及实践项目&#xff0c;旨在帮助初学者和进阶学习者更好地掌握和使用OpenCV库。 一、学习资源 官方文档&#xff1a;OpenCV的官方文档是学习OpenCV的最佳起点。它包…

MySQL-Linux安装

JDK安装&#xff08;linux版&#xff09; CentOS7环境&#xff1a; jdk下载地址huaweicloud.com 创建目录&#xff1a; mkdir /opt/jdk通过 ftp 客户端 上传 jdk压缩包&#xff08;linux版本&#xff09;到 1中目录进入目录&#xff1a;cd /opt/jdk解压&#xff1a;tar -zxv…

TRON Builder Tour 丹佛站活动获美联社等外媒高度评价

近日,波场TRON亮相ETH Denver大会并在期间成功举办TRON Builder Tour丹佛站活动,引发海外媒体热议。美联社、费加罗报、Cointelegraph等国际主流媒体及加密行业权威媒体均对此给予了高度评价,认为波场TRON在参会期间的表现及TRON Builder Tour活动的举办都展现了其坚定不移推动…

【Spring云原生系列】Spring RabbitMQ:异步处理机制的基础--消息队列 原理讲解+使用教程

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &a…

业务代码中如何使用装饰器模式?

装饰器模式&#xff08;Decorator Pattern&#xff09;介绍 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;我们可以动态地给一个对象添加额外的职责。而不是通过继承增加子类的方式来扩展对象的功能&#xff0c;装饰器模式使用组合的…

二维码门楼牌管理系统应用场景:社会服务与福利的智能化革新

文章目录 前言一、二维码门楼牌管理系统的基本功能二、在社会服务领域的应用三、在福利保障领域的应用四、结论 前言 在数字化浪潮的推动下&#xff0c;二维码门楼牌管理系统以其便捷、高效的特点&#xff0c;正逐渐渗透到社会服务和福利的各个领域。这一系统不仅为市民提供了…

【深入理解设计模式】享元设计模式

享元设计模式 概述 享元设计模式&#xff08;Flyweight Design Pattern&#xff09;是一种用于性能优化的设计模式&#xff0c;它通过共享尽可能多的相似对象来减少对象的创建&#xff0c;从而降低内存使用和提高性能。享元模式的核心思想是将对象的共享部分提取出来&#xff…

lqb省赛日志[2/37]

一只小蒟蒻备考蓝桥杯的日志 文章目录 笔记&#xff01;lqb不能用to_string和atoi历史遗留问题1 刷题心得小结 笔记 &#xff01;lqb不能用to_string和atoi 有替代方法 参考 不使用C 11的整数转字符串 C语言提供了一种方法。 #include sstream &#xff08;我没学&#xff0…

MySQL面试题-锁(答案版)

锁 1、MySQL 有哪些锁&#xff1f; &#xff08;1&#xff09;全局锁 加了全局锁之后&#xff0c;整个数据库就处于只读状态了&#xff0c;这时其他线程执行以下操作&#xff0c;都会被阻塞&#xff1a; 对数据的增删改操作&#xff0c;比如 insert、delete、update等语句&…

【粉丝福利】探秘内部审计数字化之道:精准解析转型方法与成功路径

&#x1f33c;前言 内部审计是一种独立的、客观的确认和咨询活动&#xff0c;包括鉴证、识别和分析问题以及提供管理建议和解决方案。狭义的数字化转型是指将企业经营管理和业务操作的各种行为、状态和结果用数字的形式来记录和存储&#xff0c;据此再对数据进行挖掘、分析和应…

【Linux】--- Linux编译器-gcc/g++、调试器-gdb、项目自动化构建工具-make/Makefile 使用

目录 一、Linux编译器-gcc/g1.1 gcc/g 使用方法1.2 程序的翻译过程1.3 链接 -- 动静态链接特点及区别 二、Linux调试器-gdb2.1 背景2.2 使用方法 三、Linux项目自动化构建工具-make/Makefile3.1 背景3.2 原理3.3 项目清理 一、Linux编译器-gcc/g 1.1 gcc/g 使用方法 格式&…

Linux mmap系统调用

文章目录 前言一、mmap()函数简介二、代码演示2.1 mmap使用场景2.2 私有匿名映射2.3 私有文件映射2.4 共享匿名映射2.5 共享文件映射 参考 前言 NAMEmmap, munmap - map or unmap files or devices into memorySYNOPSIS#include <sys/mman.h>void *mmap(void *addr, siz…

如何使用 ArcGIS Pro 制作三维地形图

伴随硬件性能的提高和软件算法的优化&#xff0c;三维地图的应用场景会越来越多&#xff0c;这里为大家介绍一下在ArcGIS Pro怎么制作三维地形图&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的DEM和影像数据&#xff0c;除了DEM和影像数据…

Python数据处理实战(4)-上万行log数据提取并作图进阶版

系列文章&#xff1a; 0、基本常用功能及其操作 1&#xff0c;20G文件&#xff0c;分类&#xff0c;放入不同文件&#xff0c;每个单独处理 2&#xff0c;数据的归类并处理 3&#xff0c;txt文件指定的数据处理并可视化作图 4&#xff0c;上万行log数据提取并作图进阶版&a…

vue3的开发小技巧

「总之岁月漫长&#xff0c;然而值得等待。」 目录 父组件调用子组件函数如何访问全局api 父组件调用子组件函数 ref, defineExpose //父组件 代码 <child ref"ch">this.$refs.ch.fn();//子组件 函数抛出 const fn () > { }; defineExpose({ fn });如何…

Type-C接口PD协议统一:引领电子科技新纪元的优势解析

在电子科技日新月异的今天&#xff0c;充电接口的统一化已经成为了业界的一大趋势。其中&#xff0c;Type-C接口凭借其传输速度快、使用便捷等优点&#xff0c;迅速成为了市场上的主流选择。而PD&#xff08;Power Delivery&#xff09;协议的统一&#xff0c;更是为Type-C接口…

投标中项目组织结构的设置以及调整(样式表,多级列表)

投标中项目组织结构的设置以及调整&#xff08;样式表&#xff0c;多级列表&#xff09;&#xff1a; 投标项目中需要处理大规模的文字排版&#xff0c;就是需要用到样式表&#xff08;解决层级关系&#xff09;&#xff0c;多级列表&#xff08;解决自动编号的问题&#xff0…

CSP-J 2021 T2 插入排序

文章目录 题目传送门算法解析总代码提交记录尾声 题目传送门 洛谷 P7910 [CSP-J 2021] 插入排序 算法解析 千万不要题目让你插入排序你就插入排序 首先可以用 p a i r pair pair 来存储元素的值&#xff08; f i r s t first first&#xff09;和原来的下标&#xff08; s…

Vue组件中的scoped属性

Vue组件中的scoped属性的作用是&#xff1a;当前的单文件组件的css样式只用于当前组件的template模板&#xff0c;在Vue脚手架汇总组件间关系时避免样式命名重复的情况。 原理&#xff1a;使用data-*属性在template模板中使用样式的HTML元素上添加额外属性&#xff0c;再利用标…

【UE5】游戏框架GamePlay

游戏框架 游戏 由 游戏模式(GameMode) 和 游戏状态(GameState) 所组成 加入游戏的 人类玩家 与 玩家控制器(PlayerController) 相关联 玩家控制器允许玩家在游戏中拥有 HUD&#xff0c;这样他们就能在关卡中拥有物理代表 玩家控制器还向玩家提供 输入控制&#xff08;Input…