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.runalgo-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程序员们可以更加轻松地解决问题,提高应用程序的效率和可靠性。