您的位置:

深入浅出arthas火焰图

arthas是一个非常方便的Java诊断工具,包括很多功能,例如JVM诊断、应用诊断、Spring应用诊断等。arthas使诊断问题变得更加容易和准确,因此被广泛地使用。arthas中的火焰图是一种非常有用的工具,可以大幅度提高Java代码的诊断效率。

一、什么是火焰图

火焰图是一种可视化的工具,通常用于分析CPU使用情况。横坐标表示时间,纵坐标表示堆栈。当一个函数调用另一个函数时,这个函数的堆栈会放在上一个函数堆栈的下面。每个堆栈都代表了一段时间内执行的代码。火焰图可以让我们直观地看到每个函数运行所花费的时间。

二、如何生成arthas火焰图

和其他火焰图类似,arthas的火焰图基于代码的执行时间和堆栈信息。arthas发挥了自己的优势,使生成火焰图变得非常容易。下面是arthas生成火焰图的代码:

$ java -jar arthas-boot.jar

# 进入想要诊断的Java进程
$ jps
$ dashbord

# 触发arthas fireline
$ sc -d -t ./fireline
$ profie demo.MathGame play
$ exit

运行起来,arthas就可以进行CPU分析了。

三、如何阅读火焰图

1. 了解火焰图的结构

一般来说,火焰图的每一层是一个函数,如下图所示:

  ┌─test
  ├─count
  ├─factorial
  ├─main
  └─print_usage

箭头的方向表示调用方向。箭头从下向上表示调用,从上向下表示返回。 每一层的长度表示这个函数的执行时间,即这个函数在整体执行中所占据的比例。

2. 理解函数执行时间

上一层函数的长度比下一层函数的长度要长,表示上一层函数的执行时间要长。因此,我们可以通过火焰图来找出执行时间相对比较长的函数,然后去优化它们的执行效率。

3. 了解函数之间的依赖关系

函数之间的依赖关系可以通过火焰图中的节点箭头来表示。箭头从一个函数节点指向另一个函数节点,表示这两个函数之间存在依赖关系。通过这个关系,我们可以分析函数之间的调用关系。

4. 查找函数和问题

arthas火焰图可以帮助我们找到潜在的问题。一般情况下,我们可以通过火焰图来查找执行时间比较长的函数,然后去优化它们的执行效率,这样可以大幅度地提高整个应用程序的执行效率。

四、如何使用arthas火焰图

1. 触发火焰图的生成

和其他火焰图一样,arthas火焰图也需要触发。

$ java -jar arthas-boot.jar

# 进入想要诊断的Java进程
$ jps
$ dashbord

# 触发arthas fireline
$ sc -d -t ./fireline
$ profile demo.MathGame play
$ exit

2. 查看火焰图

触发后,arthas会将火焰图生成在当前目录下。为了查看,我们可以使用浏览器打开它。

$ ls -l ./MathGame.play.dump
...

$ google-chrome ./MathGame.play.dump

3. 对红色函数进行分析

在火焰图中,红色是表示执行时间比较长的颜色。一般情况下,我们会通过红色来找到整个应用中执行时间比较长的函数。

fireline(OUT): /path/to/xxx.java:22: cost 82 (- cost 39) in cn.demo.MathGame$PlayCmd.run
  algo-1.0.0-SNAPSHOT.jar: cn.demo.MathGame.handle(RpsCommand)
    algo-1.0.0-SNAPSHOT.jar: cn.demo.MathGame.handle(RpsCommand)
      ...

  

4. 对函数堆栈进行优化

如果我们想要查看函数的堆栈,可以通过命令 stack cn.demo.MathGame$PlayCmd.run 来获取:

class:       cn.demo.MathGame
method:      run
cost:        105
size:        1.9M
start-time:  2021-10-11 17:53:34
arguments:   "com.taobao.middleware.cli.RpsCommand"
stack:
    (DONT SYNC) com.sun.tools.attach.VirtualMachineImpl.getSystemPropertiesNative line: not available [id=1]
    (DONT SYNC) com.sun.tools.attach.VirtualMachineImpl.access$400 line: not available [id=1]
    (DONT SYNC) com.sun.tools.attach.VirtualMachineImpl$1.run line: not available [id=1]
    (DONT SYNC) java.security.AccessController.doPrivileged line: not available [id=2]
    (DONT SYNC) com.sun.tools.attach.VirtualMachineImpl.attach line: not available [id=1]
    (DONT SYNC) com.alibaba.arthas.boot.loader.ArthasClassloader.attach line: not available [id=1]
    (DONT SYNC) com.alibaba.arthas.boot.AgentLauncher.attach line: not available [id=1]
    (DONT SYNC) com.alibaba.arthas.boot.AgentLauncher.launch line: not available [id=1]
    (SYNC-ING) com.alibaba.arthas.boot.AgentLauncher.premain line: not available
    ...

我们可以通过代码和函数堆栈来优化代码。

五、arthas火焰图的优势

1. 易用性高

arthas火焰图非常容易使用。在控制台中输入一些简单的命令就可以创建、查看和分析火焰图。

2. 可视化的效果

arthas火焰图非常容易读取和分析。它提供了可视化的效果,使诊断问题变得更加容易和直观。

3. 对JVM和应用的支持

arthas不仅仅支持JVM的诊断,还支持应用的诊断。这一点可以极大地提高应用程序的效率和可靠性。

4. 可扩展性高

arthas是开源的,因此具有高度可扩展性。开发人员可以很容易地改进和扩展它的功能。

六、结论

arthas火焰图是一种非常有用的Java诊断工具,可以大幅度提高Java代码的诊断效率。本文介绍了arthas火焰图的生成、阅读和使用,并且阐述了它的优点。我们相信,通过学习arthas火焰图,Java程序员们可以更加轻松地解决问题,提高应用程序的效率和可靠性。