JVM性能分析工具——Arthas及火焰图的使用

Arthas的使用

  • Arthas常用命令
  • Arthas的安装
  • Linux压测工具Apache Bench安装
  • 火焰图的使用
  • 火焰图如何分析
    • 火焰图的互动

Arthas常用命令

  • help :查看所有命令
  • dashboard :仪表板,查看线程的CPU信息等
  • heapdump :不同类对象占用内存比重,产生堆转储文件
  • thread :线程信息
  • thread -h :查看thread相关命令
  • thread -b :查找死锁
  • watch 类名 方法名 returnObj :查看方法的返回值
  • jvm :查看java进程相关参数信息,用哪种垃圾收集器等
  • jad :反编译,可以查看你所依赖的jar包,定位问题(版本是否引错)
  • redefine :热替换(线上的项目不用停,本地改了之后redefine就能变成想要的结果)
  • trace 类名 方法名 :(单机的链路追踪)
  • 其他命令参考:命令列表

Arthas的安装

  • 我使用的是Linux系统下的快速安装
  • 执行命令,curl -L https://arthas.aliyun.com/install.sh | sh 安装,默认会安装到当前目录下
  • 执行./as.sh 进入交互界面,./就是当前目录,如果执行此命令时出现:Error: no available java process to attach. 就是没有运行的java程序,我们只需要运行一个java程序即可

Linux压测工具Apache Bench安装

  • Linux压测工具Apache Bench的使用
  • 安装apache:yum install httpd ,中途输入y即可
  • 启动apache:systemctl start httpd.service
  • 安装http服务:yum install httpd
  • 查看http服务版本:httpd -version
  • 启动http服务:service httpd start
  • 查看http服务状态:service httpd status

火焰图的使用

  • 步骤一:在系统中启动一个Java项目,并且是一个不会马上停止的项目,我是将本地的SpringBoot项目打成jar包,通过java -jar运行起来的,注意要打包的项目中pom.yml要加上打包插件
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>

点击install或package 都可以,打包后的jar包会在target目录下,我们将这个jar包放到虚拟机中,切换到jar包放置的目录,执行java -jar 包名即可.
JVM性能分析工具——Arthas及火焰图的使用_第1张图片
执行后的效果如图

  • 步骤二:不能关闭步骤一的窗口,新打开一个窗口,在arthas的安装目录下执行./as.sh进入交互界面,选择刚启动的java进行,输入进行对应的数字,让arthas进行监控后开启火焰图 profiler start,等压测执行一段时间后(步骤三)关闭火焰图 profiler stop
    JVM性能分析工具——Arthas及火焰图的使用_第2张图片
    stop后会生成一个火焰图的页面
    在这里插入图片描述
    JVM性能分析工具——Arthas及火焰图的使用_第3张图片
    打开这个html就是火焰图
    JVM性能分析工具——Arthas及火焰图的使用_第4张图片
  • 步骤三:新开一个窗口,在apache bench的安装目录下进行压测模拟,执行ab -n 20000 -c 200 http://localhost:8080/

ab 就是apache bench
-n 请求的总次数
-c 并发用户数
http://localhost:8080/就是访问的这个程序地址

火焰图如何分析

参考:https://blog.csdn.net/qq_43097201/article/details/125683217

  • 颜色
    绿色:Java代码
    黄色:JVM,C++代码
    红色:用户态,C代码
    橙色:内核态,C代码
  • x-y轴
    x轴代表的不是时间,而是采样总量占用CPU的时间
    y轴代表方法的调用栈深度,倘若方法调用得越多,火焰越高,每一层代表一个方法,顶部的栈就是当前正在执行的方法
  • 栈宽含义(CPU时间)
    宽度可以理解为CPU采样率的占比,越宽代表当前栈在采样数中占比高,其可能为三种含义
    代表该函数在程序中运行所占用的CPU时间。
    代表该函数被其他函数调用的次数。
    代表该函数在程序中的复杂度,也即调用该函数的层数。
  • 平顶现象(一定要格外注意)
    平顶现象是由于当前程序的采样数在总采样数中占用过高导致的,出现这种现象需要特意关注一下程序具体的调用栈,采样比例占用率过高,即代表方法在CPU中的占用率过高

火焰图的互动

  • 鼠标悬浮:鼠标悬浮会显示所在层的方法名、采样次数、采样的占比
  • 双击:可以放大该方法所在层
  • Ctrl+F:搜索,匹配的方法高亮显示
  • 【注意】:如果你的项目调用了其他框架,则不会显示你的方法,所以火焰图其实分析不出个啥

你可能感兴趣的:(jvm)