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

news2024/11/17 12:58:04

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

文章目录

    • 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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3D-Genome | Hi-C互作矩阵归一化指南

Hi-C 是一种基于测序的方法&#xff0c;用于分析全基因组染色质互作。它已广泛应用于研究各种生物学问题&#xff0c;如基因调控、染色质结构、基因组组装等。Hi-C 实验涉及一系列生物化学反应&#xff0c;可能会在输出中引入噪声。随后的数据分析也会产生影响最终输出噪声&…

【C++】浅谈 vector 迭代器失效 深拷贝问题

目录 前言 一、底层空间改变 【错误版本1】 &#x1f31f;【解答】正确版本 ​ 【错误版本2】 &#x1f31f;【解答】正确版本 二、指定位置元素的删除操作--erase 【错误版本1】 &#x1f31f;【解答】 【错误版本2】 &#x1f31f;【解答】 三、深拷贝问题 前言 迭…

基于Jupyter快速入门Python,Numpy,Scipy,Matplotlib

文章目录 Jupyter 和 Colab 笔记本PythonPython 版本基础数据类型数字Numbers布尔值Booleans字符串Strings 容器列表List字典Dictionaries集合Sets元组Tuples 函数类 Numpy数组Array数组索引Array indexing数据类型DatatypesArray math广播Broadcasting Scipy图像操作MATLAB文件…

Pytorch_lightning先前版本的官方文档地址

https://lightning.ai/docs/pytorch/1.4.2/https://lightning.ai/docs/pytorch/1.4.2/ Pytorch_lightning更新到2后&#xff0c;和之前版本的变化较大&#xff0c;以前原有的api被删除了 比如&#xff1a;on_pretrain_routine_start 官方也没有在显眼的位置放置先前版本的文档…

3D数字孪生运行不起来?该检查你的电脑配置了

运行3D数字孪生项目通常需要一定的计算资源和图形处理能力。以下是一些常见的电脑配置要求&#xff0c;可以作为参考&#xff1a;1处理器&#xff08;CPU&#xff09;&#xff1a;推荐使用多核心处理器&#xff0c;如Intel Core i7或更高级别的处理器。较高的时钟频率和较大的缓…

3DES算法的起源与演进:保障信息安全的重要里程碑

title: 3DES算法的起源与演进&#xff1a;保障信息安全的重要里程碑 date: 2024/3/8 21:25:19 updated: 2024/3/8 21:25:19 tags: 3DES算法起源安全性增强三次迭代加密密钥管理复杂效率对比AES应用场景广泛Python实现示例 一、3DES算法的起源与演进 3DES算法是DES算法的增强版…

粉嘟嘟的免费wordpress模板

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

利用Python副业赚钱,看完这篇你就懂了!_自学python能干些什么副业?

Python都可以做哪些副业&#xff1f; 1、兼职处理数据Excel整理数据功能虽然很强大&#xff0c;但在Python面前&#xff0c;曾经统治职场的它也的败下阵来。因为Python在搜集数据整理分析数据的过程中更加便捷&#xff0c;通过几行代码还可以实现自动化操作。 如果你学会Pyth…

VSCode国内镜像下载方法

VSCode国内镜像下载方法&#xff1a; 找到下载界面&#xff0c;点击下载后&#xff0c;发现下载速度非常慢。 复制下载链接&#xff0c;然后替换图中画线部分&#xff1a; 改为&#xff1a;vscode.cdn.azure.cn 然后将链接粘贴到浏览器回车&#xff0c;会发现嗖的一下就好了

(未解决)macOS matplotlib 中文是方框

reference&#xff1a; Mac OS系统下实现python matplotlib包绘图显示中文(亲测有效)_mac plt 中文值-CSDN博客 module ‘matplotlib.font_manager‘ has no attribute ‘_rebuild‘解决方法_font_manager未解析-CSDN博客 # 问题描述&#xff08;笑死 显而易见 # solve 找到…

Docker容器化解决方案

什么是Docker&#xff1f; Docker是一个构建在LXC之上&#xff0c;基于进程容器的轻量级VM解决方案&#xff0c;实现了一种应用程序级别的资源隔离及配额。Docker起源于PaaS提供商dotCloud 基于go语言开发&#xff0c;遵从Apache2.0开源协议。 Docker 自开源后受到广泛的关注和…

springboot整合redis redis连idea

首先是maven项目里pom.xml添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-redis</artifactId> </dependency> 然后是application.properties 中增加redis配置 spring.redis.host=lo…

【Spring知识体系】1.1 Java 注解(Annotation)

文章目录 1.1 注解&#xff08;Annotation&#xff09;1.1.1 什么是注解1.1.2 内置注解1.1.3 元注解&#xff08;5种&#xff09;1.14 自定义注解1.15 注解使用场景介绍※ 本文小结 1.1 注解&#xff08;Annotation&#xff09; 1.1.1 什么是注解 注解的定义&#xff1a;它提…

FFmpeg教程(干货快速上手)

什么是FFmpeg&#xff1f; FFmpeg是一款免费、开源的跨平台多媒体处理工具&#xff0c;它支持几乎所有的视频格式和编码标准。FFmpeg包含了一系列的子项目和工具&#xff0c;如ffmpeg命令行工具用于转码和处理视频和音频文件&#xff0c;ffplay用于播放多媒体内容&#xff0c;…

​谷歌seo外链服务哪家好?

首先你要知道的&#xff0c;就是外链能起到的作用&#xff0c;不是说工具查一查外链数有增加就可以的&#xff0c;外链最重要的作用就是提升关键词排名&#xff0c;发的外链没有效果是没有任何意义的&#xff0c;而且外链基本上是一次性服务&#xff0c;服务完了没有效果完全就…

知识管理系统原来搭建起来这么简单,秘诀在这!

随着信息技术的发展&#xff0c;知识管理系统已经成为组织和团队必不可少的一部分&#xff0c;它可以帮助我们收集、组织和共享知识信息&#xff0c;提升工作效率。然而&#xff0c;搭建一套好的知识管理系统并不会一帆风顺&#xff0c;但放心&#xff0c;我们有简单易行的建设…

2024年最强云桌面科普来啦

云桌面&#xff08;Cloud Desktop&#xff09;是一种最终用户计算方法&#xff0c;它将虚拟桌面和应用程序托管在基于云的资源上&#xff0c;而不是传统的本地企业数据中心资源上。这使得用户只需通过互联网连接&#xff0c;就能够从任何地方、任何设备访问云桌面。云桌面也被称…

升级Xcode 15-全程绿灯+高速公路

还没升级Xcode15的兄弟们&#xff0c;恭喜你们&#xff0c;看完这篇文章&#xff0c;让你的升级Xcode15 之路畅通无阻外加全程高速&#x1f60e;。 前提 系统要求&#xff1a;MacOS 13.5 或更高版本 系统没达到要求的兄弟&#xff0c;先下载好系统升级包&#xff0c;下载好了…

夏朝历史及商周更替

首先我们要知道&#xff0c;为什么我们历史书上把石器时代的几千年叫做三皇五帝时期&#xff0c;而夏启开始我们叫做夏朝呢&#xff1f;那是因为夏朝开始跟原来有几个不一样的特征&#xff0c;第一是父传子家天下&#xff0c;正式确定部落或者方国&#xff08;甲骨文国字就是拿…

C++学习笔记:AVL树

AVL树 什么是AVL树?AVL树节点的定义AVL树的插入平衡因子调整旋转调整左旋转右旋转左右双旋右左双旋 AVL树完整代码实现 什么是AVL树? AVL是1962年,两位俄罗斯数学家G.M.Adelson-Velskii和E.M.Landis 为了解决如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找…