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. centos7 opencc 安装

    繁体字转换:http://xh.5156edu.com/jtof.php 转换的有问题http://tool.lu/zhconvert/ git网址:https://github.com/BYVoid ...

  2. Java工具类_表结构自动生成对应的实体类、Mapper.xml文件、Dao类

    import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWrit ...

  3. grep匹配字符串出现的次数

    背景:想要匹配一个html页面中某个字符出现的次数   遇到的问题: 用grep -c “xxx字符”得到的是行数,如果一行中有多个匹配到的字符,只会算作一个       解决方法: 使用grep - ...

  4. IEdevelopToolbar ie浏览器的css代码调试工具

    使用IEdevelopToolbar的“选择元素”工具(ctrl+b),选取你要内容的地方下方的DIV,我们就可以找到几个关键字

  5. IIS7web服务器调试ASP.net程序遇到的一些故障的解决办法

    1. [由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面] 故障描述:[由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面] ...

  6. 解决python中csv文件中文写入问题

    一.前言 一般来说,为了方便,使用python的时候都会使用csv模块去写数据到csv文件,但是写入中文的时候,经常会报错: UnicodeEncodeError: 'ascii' codec can ...

  7. php Pthread 多线程 (二) Worker和Threaded

    <?php //Worker是具有持久化上下文(执行环境)的线程对象 //Worker对象start()后,会执行run()方法,run()方法执行完毕,线程也不会消亡 class MySqlW ...

  8. Spring框架的AOP技术(注解方式)

    1. 步骤一:创建JavaWEB项目,引入具体的开发的jar包 * 先引入Spring框架开发的基本开发包 * 再引入Spring框架的AOP的开发包 * spring的传统AOP的开发的包 * sp ...

  9. Apache虚拟主机/端口多开

    Apache就是强大啊,简单配置一下就可以再开启另一个端口的web服务. 笔者最近使用XAMPP架设php服务端.有一些特别的需求:同样的代码,需要开始不同的端口, 协议类型提供web服务给客户端(h ...

  10. HDU_1022

    题目: As the new term comes, the Ignatius Train Station is very busy nowadays. A lot of student want t ...