重要参考文献:

www.brendangregg.com/blog/2017-06-30/package-flame-graph.html

www.brendangregg.com/blog/2014-06-12/java-flame-graphs.html

Java FlameGraph(火焰图)能够非常直观的展示java程序的性能分析结果,方便发现程序热点和进一步调优。本文将展示如何使用linux perf工具生成java程序的火焰图。火焰图大致长这个样子:

http://www.brendangregg.com/blog/images/2014/cpu-vertx-flamegraph.svg

火焰图的横轴表示方法耗时百分比,某个方法占用横轴越长表示占用的CPU越多,纵轴表示函数调用关系,顶端表示调用的栈顶。

linux perf是一款linux下强大的性能分析工具。学习请参考:

https://www.ibm.com/developerworks/cn/linux/l-cn-perf1/index.html

http://www.brendangregg.com/perf.html

使用perf工具生成java程序的火焰图只需两步操作,体现在如下命令当中:

# sudo perf record -F 99 -a -- sleep 30; ./jmaps
# sudo perf script | ./pkgsplit-perf.pl | grep java | ./flamegraph.pl > out.svg

第一步使用perf record收集程序运行时的堆栈信息;

第二部使用perf script生成分析结果,最终生成的out.svg文件就是火焰图。

上述命令中还用到了jmaps、pkgsplit-perf.pl、flamegraph.pl等脚本,这些脚本分类来自git项目https://github.com/brendangregg/FlameGraph。其中要着重说明的是jmaps脚本,该脚本的作用是获取java程序运行时的符号表,这样在执行perf
script时才能生成有意义的堆栈信息,该脚本依赖git项目
https://github.com/jvm-profiling-tools/perf-map-agent,下载该项目成功编译后会在out目录下生成attach-main.jar和libperfmap.so两个文件,这是获取java程序运行时符号表的关键。打开jmaps文件,可以看到如下代码:

AGENT_HOME=${AGENT_HOME:-/usr/lib/jvm/perf-map-agent}
# from https://github.com/jvm-profiling-tools/perf-map-agent

需要手动将AGENT_HOME替换为刚才编译后的per-map-agent/out/目录。

问题汇总:

perf-map-agent编译失败

perf-map-agent编译需要cmake和JDK,请现安装好cmake和JDK,并配置好JAVA_HOME。

执行./jmaps脚本出错,ERROR:
not root user? exiting...

这是因为当前用户不是root,
直接注释掉jmaps脚本中的如下代码即可:

if [[ "$USER"
!= root ]]; then

echo "ERROR:
not root user? exiting..."

exit

fi

执行./jmaps脚本出错,chown:
changing ownership of '/tmp/perf-xxx.map':
Operation not permitted

将jmaps中的代码

if [[ -e "$mapfile"
]]; then

chown root $mapfile

chmod 666 $mapfile

else

改为:

if [[ -e "$mapfile"
]]; then

sudo chown
root $mapfile

sudo chmod
666 $mapfile

else

jmaps只能获取正在执行的java程序的符号表

使用jmaps获取java程序的符号表,仅限于正在运行的Java程序,一种情况是perf record时要监测的java程序还在运行,但等到执jmaps脚本时程序已经结束,则符号表获取会失败。

使用linux perf工具生成java程序火焰图的更多相关文章

  1. linux系统分析工具续-SystemTap和火焰图(Flame Graph)

    本文为网上各位大神文章的综合简单实践篇,参考文章较多,有些总结性东西,自认暂无法详细写出,建议读文中列出的参考文档,相信会受益颇多.下面开始吧(本文出自 “cclo的博客” 博客,请务必保留此出处ht ...

  2. 【初探】java性能火焰图的生成

    前言 开始之前,你需要准备的环境: Linux系统机器或者虚拟机一台,里面需要安装的软件:git.jdk.perl. 简单介绍: java性能分析火焰图的所做的事情就是能够分析出java程序运行期间存 ...

  3. install4j 工具为java程序打包exe

    用 install4j 工具为java程序打包exe 制作人:mark 制作时间:2013-05-02 用Eclipse 将程序源码打包成jar文件. 打包jar方法我不做介绍了,相信大家都会,不会的 ...

  4. 不错的linux下通用的java程序启动脚本

    不错的linux下通用的java程序启动脚本(转载) 虽然写起动shell的频率非常不高...但是每次要写都要对付一大堆的jar文件路径,新加jar包也必须要修改起动shell. 在网上找到一个挺好的 ...

  5. 使用web3j工具生成java版本的智能合约

    这里需要使用的环境 web3j,nodejs 安装编译sol工具 $ npm install -g solc 保存为hello.sol文件到本地 pragma solidity 0.4.19; con ...

  6. jstack来分析。当linux出现cpu被java程序消耗过高时

    我们使用jdk自带的jstack来分析.当linux出现cpu被java程序消耗过高时,以下过程说不定可以帮上你的忙: 1.top查找出哪个进程消耗的cpu高 21125 co_ad2    18   ...

  7. Linux上如何执行java程序

    想要在Ubuntu上运行java程序,可以将java程序编译成功后打包,然后在Ubuntu上用命令执行jar文件 具体操作如下: 1.Windows上使用eclipse编译java工程,编译完成后导出 ...

  8. 不错的linux下通用的java程序启动脚本(转载)

    转自:http://www.cnblogs.com/langtianya/p/4164151.html 虽然写起动shell的频率非常不高...但是每次要写都要对付一大堆的jar文件路径,新加jar包 ...

  9. 利用JConsole工具监控java程序内存和JVM

    一.找到java应用程序对应的进程PI 性能测试应用程序访问地址:http://192.168.29.218:7070/training/ 部署的应用服务器为tomcat6.028 启动tomcat服 ...

随机推荐

  1. Python3使用PyQt5制作简单的画板/手写板

    0.目录 1.前言 2.简单的画板1.0 在定点和移动中的鼠标所在处画一条线 3.简单的画板2.0 在定点和移动中的鼠标所在处画一条线 并将画过的线都保留在窗体上 4.简单的画板3.0 将按住鼠标后移 ...

  2. NOIP2012junior—P1—质因数分解

    NOIP2012junior-P1-质因数分解 时间: 1000ms / 空间: 131072KB [背景] NOIP2012[描述] 已知正整数n 是两个不同的质数的乘积,试求出较大的那个质数. [ ...

  3. Android自定义processor实现bindView功能

    一.简介 在现阶段的Android开发中,注解越来越流行起来,比如ButterKnife,Retrofit,Dragger,EventBus等等都选择使用注解来配置.按照处理时期,注解又分为两种类型, ...

  4. 表单的自动到json与urlstr

    将表单序列化成json,将json转换成字符串 //将表单序列化成json 字符串 $.fn.serializeObject = function(){ var obj = {}; var count ...

  5. 轻谈BFC

    BFC 定义 CSS2.1的定义 Block formatting contexts 9.4.1 Block formatting contexts Floats, absolutely positi ...

  6. 微信小程序去除button按钮的边框

    小程序开发记录 小程序开发中, 有时候我们希望button不要有边框, 需要使用button::after来实现, 具体如下: .operations button::after{border:0 n ...

  7. 》》stroll--各种特效下拉菜单

    <!doctype html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  8. 《31天成为IT服务达人》最新文件夹

    在网上发帖后.得到广大博友的关心与帮助,提了不少好的建议和意见,本人把书稿再次做了修改,现把章节发给大家,欢迎拍砖!呵呵. 机遇篇   第一章奇葩的IT男 1.1     半年月薪过万 1.2     ...

  9. 负载均衡之基于L7负载

    L7负载平衡 还有一种较为经常使用的负载平衡解决方式则是L7负载平衡.顾名思义,其主要通过OSI模型中的第七层应用层中的数据决定怎样分发负载. 在执行时.L7负载平衡server上的操作系统会将接收到 ...

  10. javascript 正則表達式补充

    定义 JavaScript种正則表達式有两种定义方式,定义一个匹配类似 <%XXX%> 的字符串 1. 构造函数 var reg=new RegExp('<%[^%>]+%&g ...