首页 > 其他分享 >Arthas诊断工具实践

Arthas诊断工具实践

时间:2024-06-15 23:56:10浏览次数:10  
标签:java 命令 -- Arthas 实践 诊断 线程 arthas

Arthas是一款线上监控诊断产品,通过全局视角实时查看应用负载、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。

安装

如下阐述的是全量安装方式,这样就可以以离线方式使用Arthas,其他安装方式参考Arthas Install

从Maven仓库下载

最新版本,点击下载

从Github Releases页下载

https://github.com/alibaba/arthas/releases

下载后解压到指定目录即可。

启动

用as.sh启动

解压后,在文件夹里有as.sh,直接用./as.sh的方式启动:

$ ./as.sh

打印帮助信息:

$ ./as.sh -h

用arthas-boot启动

解压后,在文件夹里有arthas-boot.jar,直接用java -jar的方式启动:

$ java -jar arthas-boot.jar

打印帮助信息:

$ java -jar arthas-boot.jar -h

启动arthas成功后,就可以看到当前所有的Java进程列表,选择进程ID前面的编号,即可attach到指定进程然后执行相关arthas命令操作。
如下示例:

$ /as.sh
Arthas script version: 3.7.2
[INFO] JAVA_HOME: /Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home
Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 15440
  [2]: 33881 sentinel-dashboard-1.8.0.jar
  [3]: 1117
2 # 输入进程前面的编号
Arthas home: /Users/zhangsan/opt/arthas-packaging-3.7.2-bin
Calculating attach execution time...
Attaching to 33881 using version /Users/zhangsan/opt/arthas-packaging-3.7.2-bin...

real	0m1.730s
user	0m0.257s
sys	0m0.041s
Attach success.
telnet connecting to arthas server... current timestamp is 1718292072
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
  ,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---.
 /  O  \ |  .--. ''--.  .--'|  '--'  | /  O  \ '   .-'
|  .-.  ||  '--'.'   |  |   |  .--.  ||  .-.  |`.  `-.
|  | |  ||  |\  \    |  |   |  |  |  ||  | |  |.-'    |
`--' `--'`--' '--'   `--'   `--'  `--'`--' `--'`-----'

wiki       https://arthas.aliyun.com/doc
tutorials  https://arthas.aliyun.com/doc/arthas-tutorials.html
version    3.7.2
main_class org.springframework.boot.loader.JarLauncher
pid        33881
time       2024-06-13 23:21:12
# 到这里就说明已经成功attach到Java进程
[arthas@33881]$

常用命令

dashboard

通过dashboard命令查看进程概要,输入dashboard命令,会展示当前进程的信息,如:线程列表(按CPU执行时间降序排列),堆内存信息,操作系统信息。
当线上环境出现CPU占用高的问题时,通过dashboard命令可以找到CPU占用高的线程ID信息。
ctrl+cq可以中断执行。

heapdump

使用heapdump命令将Java进程当前的堆内存状态dump到指定文件中,类似jmap命令的heap dump功能。

$ heapdump /tmp/heapdum.hprof

memory

查看JVM内存信息,该命令没有参数。

jad

通过jad命令来反编译Class:

$ jad org.chench.extra.java.mock.impl.EmbeddedTomcatMock

执行jad命令将JVM中实际运行的class的字节码反编译成可阅读的java源码,便于确认发布到线上环境的代码是不是正确的。

  • 在Arthas控制台上,反编译出来的源码是带语法高亮的,阅读更方便
  • 反编译出来的java源码可能会存在语法错误,但不影响阅读理解

当有多个ClassLoader都加载了这个类时,jad命令会输出对应ClassLoader实例的hashcode,然后只需要重新执行jad命令,并使用参数-c 就可以反编译指定ClassLoader加载的那个类了。

sc

使用sc命令搜索所有已经加载到JVM中的Class信息:

# 模糊搜索
$ sc demo.*

# 打印类的详细信息
$ sc -d demo.MathGame

# 打印出类的 Field 信息
$ sc -d -f demo.MathGame

thread

使用thread命令可以查看线程的堆栈,主要的应用场景有:

  • 显示第一页线程的信息
    thread命令没参数时,显示第一页线程的信息。默认按照CPU增量时间降序排列,只显示第一页数据,从这里也就可以知道当前占用CPU最高的线程ID。

  • 查看当前最忙的前N个线程并打印堆栈
    执行thread -n N可以查看当前最忙的前N个线程并打印堆栈。

  • 显示指定线程的运行堆栈
    执行thread 线程ID显示指定线程的运行堆栈。

  • 获取进程的Main Class
    执行thread 1命令会打印线程ID为“1”的栈,通常是main函数的线程。

$ thread 1 | grep 'main('
    at org.chench.extra.java.mock.impl.EmbeddedTomcatMock.main(EmbeddedTomcatMock.java:24)
  • 找出当前阻塞其他线程的线程
    有时候我们发现应用卡住了,通常是由于某个线程拿住了某个锁,并且其他线程都在等待这把锁造成的。为了排查这类问题,Arthas提供了thread -b一键找出那个罪魁祸首。

  • 查看指定状态的线程
    执行thread --state 状态查看执行状态的线程列比,线程状态值有:

    • NEW :线程还为启动
    • RUNNABLE :线程运行中
    • BLOCKED :线程被阻塞
    • WAITING :线程处于永久等待状态
    • TIMED_WAITING :线程处于超时等待状态
    • TERMINATED :线程处于终止状态

watch

通过watch命令查看函数返回值,如下通过watch命令来查看demo.MathGame#primeFactors函数的返回值:

$ watch demo.MathGame primeFactors returnObj

退出

如果只是退出当前的连接,可以用quit或者exit命令,此时Attach到目标进程上的arthas还会继续运行,端口会保持开放,下次连接时可以直接连接上。
如果想完全退出Arthas,可以执行stop命令。

卸载

在Linux/Unix/Mac平台,删除下面文件:

$ rm -rf ~/.arthas/
$ rm -rf ~/logs/arthas

在Windows平台直接删除user.home下面的.arthaslogs/arthas目录。

【参考】
Arthas用户Case
JVM调优—04—-dump文件分析 、arthas在线排查工具

标签:java,命令,--,Arthas,实践,诊断,线程,arthas
From: https://www.cnblogs.com/nuccch/p/18250052

相关文章

  • 深入理解PHP数据类型:基础、用法与最佳实践
    在PHP编程中,数据类型是构成程序的基本单元,它定义了存储在变量中的数据的种类。掌握PHP的数据类型对于编写高效、可靠的代码至关重要。本文将详细介绍PHP的主要数据类型,包括它们的定义、用法和最佳实践。整数(Integer)整数类型用于存储整数,可以是正数、负数或零。在PHP中,整......
  • Java新纪元:深入探索Java 17的新特性与最佳实践
    一、主要新特性Java17作为Java的最新长期支持(LTS)版本,带来了许多新特性和改进。以下是对Java17新特性的详细探索,结合图文说明。密封类(SealedClasses)Java17引入了密封类,这是一种新的类定义方式,可以限制哪些其他类可以继承一个密封类。密封类的引入旨在解决Java中继承......
  • nginx入门与实践
    当谈到NGINX的入门与实践时,理解基本概念并能够应用实际场景非常重要。NGINX是一个高性能的HTTP和反向代理服务器,也可用作负载均衡器和HTTP缓存。以下是一些入门级别的NGINX实践和代码示例,帮助你开始学习和使用它。1.安装和基本配置安装NGINX首先,你需要安装NGINX。具体安......
  • elasticsearch的入门与实践
    Elasticsearch是一个基于Lucene构建的开源搜索引擎。它提供了一个分布式、多租户能力的全文搜索引擎,具有HTTPweb接口和无模式的JSON文档。以下是Elasticsearch的入门与实践的基本步骤:入门安装Elasticsearch:从Elasticsearch官网下载对应版本的Elasticsearch。根据操作系......
  • Redis实战指南:基础知识、实战技巧、应用场景及最佳实践全攻略
    背景在Java系统实现过程中,我们不可避免地会借助大量开源功能组件。然而,这些组件往往功能丰富且体系庞大,官方文档常常详尽至数百页。而在实际项目中,我们可能仅需使用其中的一小部分功能,这就造成了一个挑战:如何在有限的时间和精力下,高效地掌握并使用这些组件的核心功能,以实现......
  • Vue微前端架构与Qiankun实践理论指南
    title:Vue微前端架构与Qiankun实践理论指南date:2024/6/15updated:2024/6/15author:cmdragonexcerpt:这篇文章介绍了微前端架构概念,聚焦于如何在Vue.js项目中应用Qiankun框架实现模块化和组件化,以达到高效开发和维护的目的。讨论了Qiankun的原理、如何设置主应用与子......
  • 用户画像数据仓库建设实践
    一、数据仓库1.1简介  简而言之,数据仓库是一个集成的、面向主题的、相对稳定的数据集合,它能够反映数据的历史变化。在构建数据仓库时,我们会根据不同的主题域对数据进行分类,并通过数据建模技术对数据进行重新组织和抽象,以便从更高的层次对分析对象进行一致且完整的描述......
  • 【包邮送书】控制之道:过程控制的理论与实践
    欢迎关注博主Mindtechnist或加入【智能科技社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。关注公粽号《机器和智能》回复关键词“python项目实战......
  • Locust性能测试实践
    Locust性能测试实践Locust是一个开源的负载测试工具,使用Python语言实现,其简洁、轻量、高效的并发机制基于Gevent协程,可以实现单机模拟生成较高的并发压力。具有分布式和可扩展的特点,能够帮助你评估系统的性能并找到潜在的瓶颈。Locust的主要特点:使用Python编写测试脚本:你......
  • SSH实践生成密码
    $ssh-keygen-trsa-P''-f~/.ssh/id_rsa$cat~/.ssh/id_rsa.pub>>~/.ssh/authorized_keys$chmod0600~/.ssh/authorized_keys-t:指定生成密钥类型(rsa、dsa、ecdsa等)-P:指定passphrase,用于确保私钥的安全-f:指定存放密钥的文件(公钥文件默认和私钥同目录下,不同的是,存......