Java程序性能定位工具-火焰图
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程序性能定位工具-火焰图的更多相关文章
- Java程序性能优化技巧
Java程序性能优化技巧 多线程.集合.网络编程.内存优化.缓冲..spring.设计模式.软件工程.编程思想 1.生成对象时,合理分配空间和大小new ArrayList(100); 2.优化for ...
- 最近开始研究PMD(一款采用BSD协议发布的Java程序代码检查工具)
PMD是一款采用BSD协议发布的Java程序代码检查工具.该工具可以做到检查Java代码中是否含有未使用的变量.是否含有空的抓取块.是否含有不必要的对象等.该软件功能强大,扫描效率高,是Java程序员 ...
- 《Java程序性能优化:让你的Java程序更快、更稳定》
Java程序性能优化:让你的Java程序更快.更稳定, 卓越网更便宜,不错的书吧
- [JAVA] java程序性能优化
一.避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 例子: import java.util ...
- Java程序员常用工具类库
有人说当你开始学习Java的时候,你就走上了一条不归路,在Java世界里,包罗万象,从J2SE,J2ME,J2EE三大平台,到J2EE中的13中核心技术,再到Java世界中万紫千红的Framework ...
- java性能分析之火焰图
原由 最近因为kafka.zookeeper.ES和相关的Java应用的内存问题搞的头大,做运维将近4年,对Java调优.性能方面的知识了解的少之又少,是时候下定决心来对他多一个学习了.不能一口吃成一 ...
- Linux性能分析工具与图形化方法
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~. 作者:赵坤|腾讯魔王工作室后台开发工程师 在项目开发中,经常会遇到程序启动时间过长.CPU使用率过高等问题,这个时候需要依靠性能分析工具来 ...
- Java虚拟机性能监测工具Visual VM与OQL对象查询语言
1.Visual VM多合一工具 Visual VM是一个功能强大的多合一故障诊断和性能监控的可视化工具,它集成了多种性能统计工具的功能,使用 Visual VM 可以代替jstat.jmap.jha ...
- Linux性能分析利器——火焰图的安装使用
火焰图(flame graph)是性能分析的利器,通过它可以快速定位性能瓶颈点. perf 命令(performance 的缩写)是 Linux 系统原生提供的性能分析工具,会返回 CPU 正在执行的 ...
随机推荐
- PyDev找不到的问题
[PyDev找不到的问题] 下载最新版本eclipse,下载最新版jdk,即可. 参考:http://blog.csdn.net/cnweike/article/details/27096113
- 10.9zuoye
public class fulei { public fulei() { System.out.println("欢迎使用海尔"); } public String Pinpai ...
- java并发:Condition的应用
Condition类可以使线程等待,也可以唤醒线程.Condition类的await方法和Object类的wait方法等效Condition类的signal方法和Object类的notify方法等效C ...
- Struct2总结
摘自<javaWeb整合开发王者归来> 一.Struct2工作流程 1.访问jsp页面 /struts2/login.jsp 2.提交表单后数据提交给 /struts2/loginPer ...
- Tree(树链剖分+线段树延迟标记)
Tree http://poj.org/problem?id=3237 Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 12 ...
- 什么是Shell、Shell脚本
Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁.Shell既是一种命令语言,又是一种程序设计语言.作为命令语言,它交互式地解释和执行用户输入的命令:作为程序设计语言,它定义了各种 ...
- Linux-——grep
概念介绍 grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具 ...
- IIS 设置404页面 显示系统找不到指定的文件
1.原因就是IIS的普通用户没有访问404页面的权限,造成了自定义404页面无法显示.只需要将user用户组具有读的权限即可.
- apache日志里出现GET http://wujieliulan.com/mnews.htmHTTP/1.1解决方法
笔者最近搭建了服务器,Ubuntu 16.04.3 LTS,apache日志里老是出现一些莫名其妙的日志. 好像谁用了我的服务器做代理,日志如下 凭借着小学文化 :) 勉强读懂了汉语拼音wujieli ...
- 如何移除 input type="number" 时浏览器自带的上下箭头?
Chrome 下 input::-webkit-outer-spin-button, input::-webkit-inner-spin-button { -webkit-appearance: no ...