Java程序性能定位工具-火焰图

前言

Java火焰图是一种新的查看CPU利用率方式。今天就带大家一起使用来自Google大神的工具来生成火焰图。火焰图非常的直观,问题一目了然,希望有一天它能成为JAVA标准性能调优工具里面的一员。

下图所示的就是一个火焰图的样子。在这里附上一个地址,感性的同学可以打开这个地址体验下火焰图的动态效果。地址是:http://www.brendangregg.com/blog/images/2014/cpu-vertx-flamegraph.svg

在这里解释下图的看法,Y轴表示栈的深度,X轴的宽度表示样本的数量。每一个长方形表示一个栈的窗口。请注意,火焰图中的颜色不重要,只是为了方便观看,没有任何实际的意义。从左到右的顺序也无关紧要。

火焰图第一步-性能数据采集

使用lightweight-java-profiler这个开源的工具来收集CPU性能数据。目前这个工具还没有做到开箱即用的能力,因此需要自己动手来搞定。

1. 需要linux环境。

如果你的linux环境下没有git客户端,可以在其他机器上checkout出来工程,然后复制过来。

打包过程中还需要make工具,这个需要自己安装。

2. Checkout工程。

https://github.com/dcapwell/lightweight-java-profiler.git

3. 定制Makefile

根据你操作系统的情况,需要修改工程目录下的Makefile文件。在这里主要有两个地方需要修改:一是操作系统位数;二是要包含的路径。

4c4

< BITS?=32

---

> BITS?=64

49c49

< INCLUDES=-I$(JAVA_HOME)/$(HEADERS) -I$(JAVA_HOME)/$(HEADERS)/$(UNAME)

---

> INCLUDES=-I$(JAVA_HOME)/$(HEADERS) -I$(JAVA_HOME)/$(HEADERS)/$(UNAME) -I/usr/include/x86_64-linux-gnu

按照我的经验,只需要修改BITS参数即可,另外一个参数可不修改。

4. 定制性能采集参数

你可以按照自己的喜好去修改lightweight-java-profiler中的源代码来达到定制的目的。参数修改主要在src/globals.h文件中,下面就列出几个值得关注的地方:

// 每秒采集次数

static const int kNumInterrupts = 100;

// 追踪的栈的最大深度

static const int kMaxStackTraces = 3000;

// 栈的最大采集窗口数

static const int kMaxFramesToCapture = 128;

5. 编译软件

执行命令 make all 并等待结束。

6. 安装到你的工程中

将工程下面的结果输出目录\build-{BITS}下面的liblagent.so文件拷贝到和你要测试的工程的同台机器上并记下路径。在JAVA启动命令中加入如下参数:

-agentpath:{按实际路径填写}/liblagent.so

7. 运行你的工程

运行你的工程并对你的业务进行一些操作,一段时间后停止你的业务。注意:如果使用kill命令停止进程一定不要加额外的参数,使用 kill {进程号}即可,CPU采集数据会慢慢输出到工程当前目录,输出完成后进行停止。输出的文件名一般为:traces.txt

火焰图第二步-生成火焰图

这一步是基于上一步的traces.txt文件进行的。这个工具依赖于perl,因此开始之前请安装perl。

1. 克隆火焰图工具

git clone http://github.com/brendangregg/FlameGraph

cd FlameGraph

2. 生成火焰图

使用如下的命令生成火焰图:

./stackcollapse-ljp.awk < ../traces.txt | ./flamegraph.pl > ../traces.svg

其中第一个参数标识输入的性能数据文件的路径,第二个参数表示生成的火焰图文件的输出路径。

总结

火焰图对性能是有影响的,合理的调整参数对发现问题是有帮助的。

Java程序性能定位工具-火焰图的更多相关文章

  1. Java程序性能优化技巧

    Java程序性能优化技巧 多线程.集合.网络编程.内存优化.缓冲..spring.设计模式.软件工程.编程思想 1.生成对象时,合理分配空间和大小new ArrayList(100); 2.优化for ...

  2. 最近开始研究PMD(一款采用BSD协议发布的Java程序代码检查工具)

    PMD是一款采用BSD协议发布的Java程序代码检查工具.该工具可以做到检查Java代码中是否含有未使用的变量.是否含有空的抓取块.是否含有不必要的对象等.该软件功能强大,扫描效率高,是Java程序员 ...

  3. 《Java程序性能优化:让你的Java程序更快、更稳定》

    Java程序性能优化:让你的Java程序更快.更稳定, 卓越网更便宜,不错的书吧

  4. [JAVA] java程序性能优化

    一.避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 例子: import java.util ...

  5. Java程序员常用工具类库

    有人说当你开始学习Java的时候,你就走上了一条不归路,在Java世界里,包罗万象,从J2SE,J2ME,J2EE三大平台,到J2EE中的13中核心技术,再到Java世界中万紫千红的Framework ...

  6. java性能分析之火焰图

    原由 最近因为kafka.zookeeper.ES和相关的Java应用的内存问题搞的头大,做运维将近4年,对Java调优.性能方面的知识了解的少之又少,是时候下定决心来对他多一个学习了.不能一口吃成一 ...

  7. Linux性能分析工具与图形化方法

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~. 作者:赵坤|腾讯魔王工作室后台开发工程师 在项目开发中,经常会遇到程序启动时间过长.CPU使用率过高等问题,这个时候需要依靠性能分析工具来 ...

  8. Java虚拟机性能监测工具Visual VM与OQL对象查询语言

    1.Visual VM多合一工具 Visual VM是一个功能强大的多合一故障诊断和性能监控的可视化工具,它集成了多种性能统计工具的功能,使用 Visual VM 可以代替jstat.jmap.jha ...

  9. Linux性能分析利器——火焰图的安装使用

    火焰图(flame graph)是性能分析的利器,通过它可以快速定位性能瓶颈点. perf 命令(performance 的缩写)是 Linux 系统原生提供的性能分析工具,会返回 CPU 正在执行的 ...

随机推荐

  1. linux sleep用法

    应用程序:#include <syswait.h>usleep(n) //n微秒Sleep(n)//n毫秒sleep(n)//n秒驱动程序:#include <linux/delay ...

  2. drupal sql 源码解析query.inc 文件

    query.inc 文件: sql语句: $this->condition($field);1707 line public function condition($field, $value ...

  3. SharePoint 2010 图表控件

    需求: 统计每周的事件创建数量及关闭数量 以折线的形式显示 一张图表显示两条折线 知识点: 图表控件的使用 外部内容类型 数据库(sql)view(数据源) 结果:

  4. 早停法(Early Stopping)

    一.早停法简介(Early Stopping)当我们训练深度学习神经网络的时候通常希望能获得最好的泛化性能(generalization performance,即可以很好地拟合数据).但是所有的标准 ...

  5. 蚁群算法(Java)tsp问题

      1.理论概述 1.1.TSP问题 旅行商问题,即TSP问题(旅行推销员问题.货郎担问题),是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只 ...

  6. gridview 级联删除、dataset

    gridview编辑列(不使用控件绑定数据源)需要如下代码:<asp:GridView ID="GridView1" runat="server" Aut ...

  7. 清空表中数据 id从1开始

    删除表的记录以后,如何使新记录的编号仍然从1开始有两种方法: 方法1: truncate table 你的表名 --这样不但将数据删除,而且可以重新置位identity属性的字段. 方法2: dele ...

  8. tp中url地址大小写问题

    在tp配置文件中有一个URL_CASE_INSENSITIVE选项,设置为true,表示大小写不敏感. 'URL_CASE_INSENSITIVE' => true

  9. DB2锁机制

    相比较Oracle来说,DB2的锁机制麻烦了很多,而且这个麻烦带来的不是性能的上升而是下降,不过如果细致了解的话,只能感慨不愧是数据库理论诞生的公司,在实现数据库理论上比Oracle全面得多.    ...

  10. jstl标签详解 (转载)

    JSLT标签库,是日常开发经常使用的,也是众多标签中性能最好的.把常用的内容,放在这里备份一份,随用随查.尽量做到不用查,就可以随手就可以写出来.这算是Java程序员的基本功吧,一定要扎实. JSTL ...