非常好用的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: 3658session-timeout: 1800# 127.0.0.1只能本地访问,0.0.0.0则可网络访问,但是存在安全问题ip: 127.0.0.1appName: 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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法刷题day25:多路归并

目录 引言概念一、鱼塘钓鱼二、技能升级三、序列 引言 关于这个多路并归蓝桥杯考的不是很多&#xff0c;如果要出的话&#xff0c;可能模型都会差不多&#xff0c;因为不会出太难的题&#xff0c;难题基本上都是贪心、DP之类的&#xff0c;所以好好刷题刷熟练就行了&#xff0…

运用jmeter做接口与性能测试

接口概念 不同单元或某块之间进行通信的通道&#xff0c;他有一套规范一套标准&#xff08;数据与数据之间的交互&#xff09;&#xff08;遵循既定规则&#xff0c;比如百度搜索的wd&#xff09;接口规范会预定到文档&#xff0c;称之为api文档 接口的作用 项目开发中&#…

粉嘟嘟的免费wordpress模板

粉色好看的wordpress免费模板&#xff0c;用免费wordpress模板也可以搭建网站。 https://www.wpniu.com/themes/11.html

七彩虹@电脑cpu频率上不去问题@控制中心性能模式cpu频率上不去@代理服务器超时@账户同步设置失败

文章目录 windows电脑cpu频率上不去新电脑的系统时间问题系统时间不准造成的具体问题举例代理超时vscode同步请求失败自动校准时间 windows电脑cpu频率上不去 问题描述,标压处理器的笔记本,cpu频率上不去 如果cpu没问题的话,就应该是系统限制了功耗导致的有的笔记本有控制中心…

WordPress建站入门教程:如何创建菜单和设置前端导航菜单?

前面我们跟大家分享了WordPress如何上传安装WordPress主题&#xff0c;但是启用主题后前端没有看到有导航菜单&#xff0c;这是因为我们还没有创建菜单和设置导航菜单。 JianYue主题导航菜单和右上角菜单 今天boke112百科就继续跟大家分享WordPress站点如何创建菜单和设置前端…

基于SVM模型的网络入侵检测模型训练与评估(NSL-KDD数据集)

简介 针对网络安全领域的NSL-KDD数据集进行分类任务的预处理和模型训练、以及超参数调优。 数据预处理 读取并解析数据集&#xff1b;检查并删除指定列&#xff08;outcome&#xff09;的缺失值&#xff1b;对类别型特征&#xff08;protocol_type, service, flag&#xff0…

13 OpenCv自定义线性滤波

文章目录 卷积算子示例 卷积 卷积是图像处理中一个操作&#xff0c;是kernel在图像的每个像素上的操作。Kernel本质上一个固定大小的矩阵数组&#xff0c;其中心点称为锚点(anchor point) 把kernel放到像素数组之上&#xff0c;求锚点周围覆盖的像素乘积之和&#xff08;包括锚…

JavaWeb——015 Maven高级(分模块设计与开发、继承与聚合、私服)

Maven高级 目录 Maven高级1. 分模块设计与开发1.1 介绍1.2 实践1.2.1 分析1.2.2 实现 1.3 总结 2. 继承与聚合2.1 继承2.1.1 继承关系2.1.1.1 思路分析2.1.1.2 实现 2.1.2 版本锁定2.1.2.1 场景2.1.2.2 介绍2.1.2.3 实现2.1.2.4 属性配置 2.2 聚合2.2.1 介绍2.2.2 实现 2.3 继承…

IP定位技术在金融风控中的应用研究

随着金融科技的快速发展&#xff0c;金融行业的风险也呈现出多样化、复杂化的特点。金融风控作为保障金融安全的重要手段&#xff0c;其面临的挑战也日益加剧。在这样的背景下&#xff0c;IP定位技术作为一种先进的信息技术手段&#xff0c;正逐渐成为金融风控领域的重要工具。…

STM32day3

1.思维导图 1.总结任务的调度算法&#xff0c;把实现代码再写一下 /* Definitions for myTask02 */ osThreadId_t myTask02Handle; uint32_t myTask02Buffer[ 64 ]; osStaticThreadDef_t myTask02ControlBlock; const osThreadAttr_t myTask02_attributes {.name "myTa…

spring对IOC的实现

Ioc控制反转 控制反转是一种思想。 控制反转是为了降低程序耦合度&#xff0c;提高程序扩展力&#xff0c;达到OCP原则&#xff0c;达到DIP原则。 控制反转&#xff0c;反转的是什么&#xff1f; 将对象的创建权利交出去&#xff0c;交给第三方容器负责。将对象和对象之间关系…

硬盘温度过高会怎么办?机箱温度多少算正常?

硬盘温度 硬盘在使用过程中&#xff0c;断电很容易导致数据丢失&#xff0c;但如果温度过高&#xff0c;也可能对硬盘造成损坏。 硬盘的温度是决定电脑能否正常使用的重要因素。 如果长时间读取和存储数据&#xff0c;硬盘的温度会升高。 那么&#xff0c;硬盘的正常温度是多少…