Java FlameGraph 火焰图

上周一个偶然的机会听同事提到了Java FlameGraph,刚实验了一下,效果非常好。

一、什么是FlameGraph

直接看图说话。FlameGraph 是 SVG格式,矢量图,可以随意扩大缩小,看不清的信息可以放大看。图中,各种红橙黄色没有什么意义,仅仅做区分用;x轴横条宽度来度量时间指标,表明每个接口实际占用的CPU时间;y轴代表线程栈的层次,从最底下往上表示堆栈的层层调用。通过看图,可以发现哪个接口占用的CPU时间较多,从而优化;同时,可以发现调用关系。

 

Java火焰图的作者是Brendan Gregg,他的博客非常有意思,很多关于性能的分析。以下链接是对每个类别的火焰图的详细说明。

什么是Java Flame Graphs:Java Flame Graphs

On-CPU:CPU Flame Graphs

Off-CPU:Off-CPU Flame Graphs

Memory:Memory Leak (and Growth) Flame Graphs

Hot/Cold:Hot/Cold Flame Graphs

Differential:Differential Flame Graphs

关于火焰图的PPT(讲解得非常详细):Blazing Performance with Flame Graphs

 

二、如何生成

两个步骤:1. 需要java profiler生成trace文件  2. 将trace文件转换为svg格式的火焰图文件。

1. 需要java profiler生成trace文件

在使用Profiler对CPU进行采样时,根据CPU当前执行所处栈位置以及各个函数栈在总的采样次数所占比例就可以得出各个函数执行时的CPU占用比例。常用的是lightweight-java-profiler。还有其他的选择,比如honest-profiler,lightweight-java-profiler会从java虚拟机启动开始采样,而有时候我们需要在CPU飙高的时候开始,这时候honest-profiler提供的动态启停功能就有用武之地了。也有使用perf生成火焰图。(*perf 要研究一下)

下面以lightweight-java-profiler 举例

(1) 从github下载软件

(2) 编译 make all

(3) 生成的程序存放在build-64文件夹下面

(4)(可选)可以更改一些lightweight-java-profiler的一些选项,打开src/globals.h文件。在长时间采样时,可以适当地减少每秒采样次数,不然最终生成的文件会很大,分析起来比较麻烦。

// 每秒采样频率
static const int kNumInterrupts = 100;
// Maximum number of stack traces线程栈个数
static const int kMaxStackTraces = 3000;
// 采样栈深度
static const int kMaxFramesToCapture = 128;  

  kNumInterrupts: 每秒钟抽取样本的次数;

  kMaxStackTraces: 线程栈的最大数量   

  kMaxFramesToCapture: 线程栈的深度

 

(5)运行Java程序

  java -agentpath:path/to/liblagent.so ......

(6)java程序启动后会在当前目录生成一个traces.txt文件,但文件中只有一些说明信息。程序正常结束(不杀掉进程)后,才会写入具体采样信息。

 

2.将trace文件转换为svg格式的火焰图文件。

(1)从github下载FlameGraph

(2)转换 

./stackcollapse-ljp.awk < traces.txt | ./flamegraph.pl > traces.svg
(3)浏览器中打开traces.svg文件
三、简单讨论一下Java profiler
关于采样工具的选取,可以看看文章 Evaluating the Accuracy of Java Profilers ,这里面列举了xprof,hprof,jprofile和yourkit四种采样器,并通过几个压测场景证明了这几种采样器的结果是相互矛盾的。总结的原因有两点:
1. 采样器采样点不够随机,这几种采样器都只有在safe point采样;
2. 不同的采样器会注入不同的代码,从而影响程序优化过程,同时也影响了safe point的分布,进一步造成采样差异;
honest-profiler号称是避开了通过SUN/Oracle management agent去采样堆栈,而是使用自己实现的使用UNIX 操作系统信号和为Oracle Performance Studio 设计的内部API的sampling agent,从而提升了采样准确率。
还有一篇文章和 Why many profilers have serous problems。
Java profiler 的两个常见方式:
1.修改代码,从而实现采样。问题是:1. 增加开销;2. 修改了你的代码,导致java编译器的优化行为不确定;3. 影响了代码的层次,层次越深自然也影响 执行效率。
2.通过获取on-cpu线程的线程栈方式。问题是:获取系统范围的线程栈,jvm必须处于safepoint状态(看文章What is Java safepoint)。只有当线程处于safepoint状态的时候,别的线程才能去获取它的线程栈,而这个safepoint是由jvm 控制的,这对于profiler非常不利,有可能一个很热的代码块,jvm不会在该代码块中间放置safepoint,导致profiler无法获得该线程栈,导致错误的profiler结果。

几个商用的profiler工具都存在上述问题。但是,Oracle Solaris studio利用的是jvmti的一个非标准接口AsyncGetCallTrace来实现,不存在上面问题,Jeremy Manson也利用该接口 实现了一个简单的profiler工具:lightweight-java-profiler。

 

相关知识:
部分内容摘自 http://blog.csdn.net/c395318621/article/details/55224665
部分内容摘自 http://tacy.github.io/blog/2014/07/16/FlameGraph/
部分内容摘自 http://www.javashuo.com/content/p-6579579.html
部分内容摘自 http://colobu.com/2016/08/10/Java-Flame-Graphs/
文章: Evaluating the Accuracy of Java Profilers  
文章: Why many profilers have serous problems。
文章: What is Java safepoint

 

 

转载于:https://www.cnblogs.com/xingzifei/p/7446264.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

烟草局计算机笔试,2020年广西南宁烟草局什么时候笔试?

最近广西烟草局各地市社招通知频发&#xff0c;南宁烟草局报名截止至今都无任何消息&#xff0c;根据往年的考情&#xff0c;通知近期很大可能会发布&#xff0c;将于6月底完成笔面!你备考好了吗&#xff1f;今天广西中公国企小编来给大家说一下南宁烟草局社招的笔试内容及备考…

JAVA Swing 组件演示***

下面是Swing组件的演示&#xff1a; package a_swing;import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Cursor; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.…

centos 获取硬件序列号_如何在 Linux 上查找硬件规格

在 Linux 系统上有许多工具可用于查找硬件规格。-- Sk&#xff08;作者&#xff09;在 Linux 系统上有许多工具可用于查找硬件规格。在这里&#xff0c;我列出了四种最常用的工具&#xff0c;可以获取 Linux 系统的几乎所有硬件&#xff08;和软件&#xff09;细节。好在是这些…

Spring –持久层–编写实体并配置Hibernate

欢迎来到本教程的第二部分。 当您看到本文有多长时间时&#xff0c;请不要惊慌–我向您保证&#xff0c;这主要是简单的POJO和一些生成的代码。 在开始之前&#xff0c;我们需要更新我们的Maven依赖项&#xff0c;因为我们现在将使用Hibernate和Spring。 将以下依赖项添加到pom…

无线服务器主机名是,wifi默认服务器主机名

wifi默认服务器主机名 内容精选换一换以CentOS 7操作系统的弹性云服务器为例&#xff1a;登录Linux弹性云服务器&#xff0c;查看“cloud-init”的配置文件。检查“/etc/cloud/cloud.cfg”文件中“update_hostname”是否被注释或者删除。如果没有被注释或者删除&#xff0c;则需…

pygame里面物体闪烁运动_利用自闪烁发光二极管探究小车在倾斜轨道上的运动规律...

2020年11月23日&#xff0c;周一&#xff0c;24小时安全值班。利用当班中午的时间&#xff0c;微主在创客空间测试了自闪烁发光二极管在匀加速运动中的效果&#xff0c;结果还比较满意。将小车放置在倾斜的轨道上&#xff0c;将自闪烁发光二极管和纽扣电池构成频闪光源&#xf…

python网络爬虫与信息提取 学习笔记day3

Day3&#xff1a; 只需两行代码解析html或xml信息 具体代码实现:day3_1 注意BeautifulSoup的B和S需要大写&#xff0c;因为python大小写敏感 import requests r requests.get("http://python123.io/ws/demo.html") r.text demo r.text from bs4 import Beauti…

王者荣耀微信哪个服务器人最少,王者荣耀:微信区王者人数锐减,大神们都去哪了?这些原因很真实...

原标题&#xff1a;王者荣耀&#xff1a;微信区王者人数锐减&#xff0c;大神们都去哪了&#xff1f;这些原因很真实王者荣耀&#xff1a;微信区王者人数锐减&#xff0c;大神们都去哪了&#xff1f;这些原因很真实大家好&#xff01;王者荣耀S16赛季已经开启一月之余&#xff…

一个div压在另一个div上面_【CSS小分享】用CSS画一个新拟态风格键盘

什么是新拟态新拟态的英文名称是“Neumorphism”&#xff0c;也有人称为“Soft UI”。简单讲&#xff0c;新拟态是一种图形样式&#xff0c;其原理是通过模拟真实物体来为界面的UI元素赋予真实感。新拟态风格起源于dribbble&#xff0c;后面陆续被收录在2020设计趋势预测里面&a…

Hibernate中Hql查询

这篇随笔将会记录hql的常用的查询语句&#xff0c;为日后查看提供便利。 在这里通过定义了三个类&#xff0c;Special、Classroom、Student来做测试&#xff0c;Special与Classroom是一对多&#xff0c;Classroom与Student是一对多的关系&#xff0c;这里仅仅贴出这三个bean的属…

Java代码质量工具–概述

最近&#xff0c;我有机会在本地IT社区聚会上介绍了该主题。 这是基本演示&#xff1a; Java代码质量工具 以及更有意义的思维导图&#xff1a; 但是&#xff0c;我认为我需要更深入地探讨这一主题。 这篇博客文章应该像是在此方向上进行进一步调查的起点。 1. CodePro Anal…

cuda版本查看_ubuntu安装CUDA

0 写在前面安装环境&#xff1a;ubuntu18.04以及GTX1050Ti笔记本为什么要安装CUDA&#xff1f; 参考百科&#xff0c;CUDA是英伟达推出的集成技术&#xff0c;通过该技术可利用GeForce 8 以后的GPU或者较新的Quadro GPU进行计算。例如典型的tensorflow-GPU和pyCUDA安装之前都要…

idea新建scala文件_IDEA maven项目中新建.scala文件

本文首发于我的博客[IDEA maven项目中新建.scala文件]分为三步第一步、IDEA中安装scala插件1、搜索安装File-Sittings-Plugins-搜索安装scala2、安装完成重启安装完成之后点击重启idea第二步、下载、安装、配置Scala1、下载安装Scala SDK本体搜索引擎搜索Scala SDK或者点我去Sc…

Log4j线程死锁–案例研究

此案例研究描述了影响Weblogic Portal 10.0生产环境的Apache Log4j线程争用问题的完整根本原因分析和解决方案。 它还将说明在开发和支持Java EE应用程序时适当的Java类加载器知识的重要性。 本文也是您提高线程转储分析技能和了解线程竞争条件的另一个机会。 环境规格 Java …

堆栈跟踪从何而来?

我认为&#xff0c;阅读和理解堆栈跟踪是每个程序员都必须具备的一项基本技能&#xff0c;以便有效地解决每种JVM语言的问题&#xff08;另请参阅&#xff1a; 过滤日志中无关的堆栈跟踪行和首先记录引起异常的根本原因 &#xff09;。 那么我们可以从一个小测验开始吗&#xf…

@select 怎么写存储过程_MySQL4:存储过程和函数

什么是存储过程简单说&#xff0c;存储过程就是一条或多条SQL语句的集合&#xff0c;可视为批文件&#xff0c;但是起作用不仅限于批处理。本文主要讲解如何创建存储过程和存储函数以及变量的使用&#xff0c;如何调用、查看、修改、删除存储过程和存储函数等。使用的数据库和表…

跨域访问-预请求及跨域常见问题

预请求 参考&#xff1a;https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS#预请求 简而言之&#xff0c;在跨域并且尝试添加一些特殊头及自定义头的情况下&#xff0c;由于浏览器的安全机制&#xff0c;会加多一次OPTIONS预请求&#xff08;询问请求&am…

mysql查询优化之一:mysql查询优化常用方式

一、为什么查询速度会慢&#xff1f; 一个查询的生命周期大致可以按照顺序来看&#xff1a;从客户端&#xff0c;到服务器&#xff0c;然后在服务器上进行解析&#xff0c;生成执行计划&#xff0c;执行&#xff0c;并返回结果给客户端。其中在“执行”阶段包含了大量为了检索…

抖音右上角一个小黄点是什么_抖音官方入驻视频号,释放了一个什么样的信号?...

专注视频号观察第 328 篇这几天&#xff0c;视频号生态新入驻了一个企业号&#xff0c;在圈里引起不少的轰动&#xff0c;因为这个号的名字叫做———抖音。这件事在圈里引发不少的轰动&#xff0c;很多人惊叹&#xff1a;“连抖音都来开视频号了&#xff0c;你还在等什么&…

Jenkins:部署JEE工件

随着持续集成和持续交付的出现 &#xff0c;我们的构建被分为不同的步骤&#xff0c;以创建部署管道。 这些步骤中的一些步骤可以是例如编译和运行快速测试&#xff0c;运行慢速测试&#xff0c;运行自动验收测试或发布应用程序等。 部署流程的最后一步意味着将我们的产品&…