JVM 调优篇10 使用arthas排优

一 Arthas的作用

1.1 作用

  1. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?

2.是否有一个全局视角来查看系统的运行状况?

  1. 有什么办法可以监控到JVM的实时运行状态?

  2. 怎么快速定位应用的热点,生成火焰图?

二 安装操作

2.1 linux的安装

下载arthas-boot.jar 然后运行 java -jar 的方式启动

2.2 windows的安装

在c:\下创建目录arthas,在windows命令窗口下,使用curl命令下载阿里服务器上的jar包,大小约诶108k。

  1. 使用java启动arthas-boot.jar,来安装arthas,大小约10M。运行此命令会发现java进程,输入1
    按回车。则自动从远程主机上下载arthas到本地目录

    3.查看安装目录

三 常用操作

3.1 操作api


输入dashboard命令

输入thread命令

输入monitor命令

四 通过arthas生成火焰图

4.1 profile命令

profiler 命令支持生成应用热点的火焰图。本质上是 通过不断的采样,然后把收集到的采样结果生成火焰图。

4.2 火焰图的解析

y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高**,顶部就是正在执行的函数,下方都是它的父函数。**

x 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。

火焰图就是看顶层的哪个函数占据的宽度最大。只要有"平顶"(plateaus),就表示该函数可能存在性能问题。

颜色没有特殊含义,因为火焰图表示的是 CPU 的繁忙程度,所以一般选择暖色调。

最顶层的函数g()占用 CPU 时间最多。d()的宽度最大,但是它直接耗用 CPU 的部分很少。b()和c()没有直接消耗 CPU。因此,如果要调查性能问题,首先应该调查g(),其次是i()。

另外,从图中可知a()有两个分支b()和h(),这表明a()里面可能有一个条件语句,而b()分支消耗的 CPU 大大高于h()。

Arthas profiler(使用async-profiler对应用采样,生成火焰图)_51CTO博客_async.art

4.3 常用命令

1.常用命令

2.操作命令

1启动profiler,默认情况下,生成的是 cpu 的火焰图,即 event 为cpu。可以用--event参数指定其他性能分析模式,见下文。

$ profiler start

Started [cpu] profiling

2.显示支持的事件

profiler list

3.获取已采集的sample的数量

$ profiler getSamples

23

4.查看profiler状态(可以查看当前profiler在采样哪种event和采样时间。

$ profiler status

[cpu] profiling is running for 4 seconds

5.停止profiler,并同步生成文件(默认在工作目录下的arthas-output目录。)

$ profiler stop

profiler output file: /tmp/demo/arthas-output/20240919-155147.svg

通过 --file参数来指定输出结果路径,在--file参数指定的文件名后缀为 html 或 jfr 时,文件格式可以被推断出来。比如--file /tmp/result.html 将自动生成火焰图。

指定生成的文件名以及路径

profiler stop --file /tmp/result.svg

6.生成html文件

可以用--format指定生成格式,默认情况下,结果是 Flame Graph格式的 html 文件,也可以用 -o 或 --format 参数指定其他内容格式,包括 flat、traces、collapsed、flamegraph、tree、jfr。

profiler stop --format html

4.4 操作案例截图

相关推荐
Algorithm157614 小时前
JVM是什么,与Java的关系是什么,以及JVM怎么实现的跨平台性
java·开发语言·jvm
王佑辉14 小时前
【jvm】所有的线程都共享堆吗
jvm
琪露诺大湿20 小时前
JavaEE-多线程初阶(1)
java·linux·开发语言·jvm·数据库·java-ee·1024程序员节
威哥爱编程21 小时前
Java Z 垃圾收集器如何彻底改变内存管理
java·jvm·zgc
与海boy1 天前
第七章 JVM对高效并发的支持
jvm
王佑辉1 天前
【jvm】如何设置堆内存大小
jvm
MegaDataFlowers1 天前
JDK、JRE、JVM之间的关系
java·开发语言·jvm
程序员阿鹏1 天前
详解:单例模式中的饿汉式和懒汉式
java·开发语言·jvm·后端·单例模式·eclipse
梦城忆1 天前
JVM基础(内存结构)
开发语言·jvm·python
AGi_2 天前
Java基础-JVM
java·开发语言·jvm