java性能火焰图的生成实践

 更新时间:2025年07月10日 16:13:13   作者:运维打怪晋级之路  
文章介绍async-profiler这一Java性能分析工具,可低开销生成火焰图,帮助定位CPU飙升、内存泄露等问题,涵盖准备程序、生成数据及展示三个核心步骤,适合解决线上性能瓶颈

序言

如果你经常遇到 Java 线上性能问题束手无策,看着线上服务 CPU 飙升一筹莫展,发现内存不断泄露满脸茫然。

别慌,这里有一款低开销、自带火焰图、让你大呼好用的 Java 性能分析工具 - async-profiler。

1、准备程序

[root@localhost ~]# git clone git://github.com/jvm-profiling-tools/async-profiler
[root@localhost async-profiler]# yum -y install gcc+ gcc-c++
[root@localhost async-profiler]# make 
[root@localhost ~]# more  Test.java  
public class Test {

    public static void main(String[] args) throws Exception {
        Test test = new Test();
        while (true) {
            test.func1();
            test.func2();
            test.func3();
        }
    }

    public void func1() throws Exception { //调用第一个方法,需要100ms
        Thread.sleep(100L);
    }

    public void func2() throws Exception { //调用第二个方法,需要500ms
        Thread.sleep(500L);
    }

    public void func3() throws Exception { //调用第三个方法,需要1500ms
        Thread.sleep(1500L);
    }

}
[root@localhost ~]# 
[root@localhost ~]#  javac Test.java 
[root@localhost ~]# java Test

生成火焰图数据

root      21765   7152  0 18:29 pts/1    00:00:00 java Test
root      21799  21777  0 18:29 pts/0    00:00:00 grep --color=auto java
[root@localhost ~]# cd async-profiler/
[root@localhost async-profiler]# 
[root@localhost async-profiler]# ./profiler.sh -d 60 -o collapsed -f /tmp/test_01.txt  21765
Profiling for 60 seconds
Done
[root@localhost async-profiler]# cd ..
[root@localhost ~]# ls
anaconda-ks.cfg  a.out  async-profiler  FlameGraph  jdk-8u121-linux-x64.tar.gz  perf.data  process.svg  test.c  Test.class  Test.java
[root@localhost ~]# cd  FlameGraph/
[root@localhost FlameGraph]# perl flamegraph.pl --colors=java /tmp/test_01.txt > test_01.svg
[root@localhost FlameGraph]# ls
aix-perf.pl                example-perf-stacks.txt.gz  README.md                  stackcollapse-instruments.pl      stackcollapse-pmc.pl        test
demos                      example-perf.svg            record-test.sh             stackcollapse-java-exceptions.pl  stackcollapse-recursive.pl  test_01.svg
dev                        files.pl                    stackcollapse-aix.pl       stackcollapse-jstack.pl           stackcollapse-sample.awk    test.sh
difffolded.pl              flamegraph.pl               stackcollapse-bpftrace.pl  stackcollapse-ljp.awk             stackcollapse-stap.pl
docs                       jmaps                       stackcollapse-elfutils.pl  stackcollapse-perf.pl             stackcollapse-vsprof.pl
example-dtrace-stacks.txt  pkgsplit-perf.pl            stackcollapse-gdb.pl       stackcollapse-perf-sched.awk      stackcollapse-vtune.pl
example-dtrace.svg         range-perf.pl               stackcollapse-go.pl        stackcollapse.pl                  stackcollapse-xdebug.php
[root@localhost FlameGraph]# sz test_01.svg

3、展示

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring Boot实现异步请求(Servlet 3.0)

    Spring Boot实现异步请求(Servlet 3.0)

    在spring 3.2 及以后版本中增加了对请求的异步处理,这篇文章主要介绍了Spring Boot实现异步请求(Servlet 3.0),感兴趣的小伙伴们可以参考一下。
    2017-04-04
  • 在Java中读取和解析JSON文件的示例代码

    在Java中读取和解析JSON文件的示例代码

    我们在日常开发中少不了和JSON数据打交道,JSON是轻量、结构化的数据交换格式,支持跨语言,本文给大家详细介绍了如何在 Java 中读取和解析 JSON 文件,并有详细的代码示例供大家参考,需要的朋友可以参考下
    2025-06-06
  • SpringData JPA基本/高级/多数据源的使用详解

    SpringData JPA基本/高级/多数据源的使用详解

    这篇文章主要介绍了SpringData JPA基本/高级/多数据源的使用详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • java线程中synchronized和Lock区别及介绍

    java线程中synchronized和Lock区别及介绍

    这篇文章主要为大家介绍了java线程中synchronized和Lock区别及介绍,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • Java中的BufferedInputStream与BufferedOutputStream使用示例

    Java中的BufferedInputStream与BufferedOutputStream使用示例

    BufferedInputStream和BufferedOutputStream分别继承于FilterInputStream和FilterOutputStream,代表着缓冲区的输入输出,这里我们就来看一下Java中的BufferedInputStream与BufferedOutputStream使用示例:
    2016-06-06
  • RabbitMq报错reply-code=406 reply-text=PRECONDITION_FAILED解决

    RabbitMq报错reply-code=406 reply-text=PRECONDITION_FAILED

    这篇文章主要为大家介绍了RabbitMq报错reply-code=406 reply-text=PRECONDITION_FAILED分析解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • SpringBoot线上环境彻底关闭Swagger-UI的方式

    SpringBoot线上环境彻底关闭Swagger-UI的方式

    这篇文章主要给大家介绍了SpringBoot线上环境彻底关闭Swagger-UI的方式,文中给出了详细的代码示例供大家参考,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2023-12-12
  • 一小时迅速入门Mybatis之实体类别名与多参数 动态SQL

    一小时迅速入门Mybatis之实体类别名与多参数 动态SQL

    这篇文章主要介绍了一小时迅速入门Mybatis之实体类别名与多参数 动态SQL,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Java爬虫 信息抓取的实现

    Java爬虫 信息抓取的实现

    本文主要介绍 Java爬虫 信息抓取的实现,这里详细介绍了如何实现该方法,并附示例代码供大家学习参考,有兴趣的小伙伴可以参考下
    2016-09-09
  • Java的stream流多个字段排序的实现

    Java的stream流多个字段排序的实现

    本文主要介绍了Java的stream流多个字段排序的实现,主要是两种方法,第一种是固定多个字段排序和第二种动态字段进行排序,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10

最新评论