文档章节

lightweight java profiler与java flame graph初了解

dokia
 dokia
发布于 2015/12/29 10:20
字数 825
阅读 144
收藏 1
点赞 0
评论 0

了解java程序中CPU占用情况对于java程序开发,尤其是后台服务开发来说是一件必要且重要的事情。在分析高并发下服务性能压力时,需要了解程序中长时间占用CPU的程序块。这需要我们使用分析器(profiler)在java进程运行的过程中定时抽样分析。

lightweight java profiler是一种针对java的轻量级分析器,使用步骤简单,共分为两步:

  1. 获得源码,make all,在build-32/build-64目录下生存liblagent.so库文件

  2. 执行java程序,并将此库文件作为-agentpath加入java虚拟机选项中去

运行一段时间后退出java程序,java程序根目录下会生成跟踪文件traces.txt,里面记录了定时抽样获得的java堆栈信息。

分析器默认参数:

// Number of times per second that we profile
static const int kNumInterrupts = 100;

// Maximum number of stack traces
static const int kMaxStackTraces = 3000;

// Maximum number of frames to store from the stack traces sampled.
static const int kMaxFramesToCapture = 128;

// Location where the data are dumped.
static const char kDefaultOutFile[] = "traces.txt";

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

kMaxStackTraces: 抽取栈的最高数量;超过此数量的栈信息将不再被记录,但重复的栈仍然会被记录;

kMaxFramesToCapture: 获取帧最大数量;意义不明,我猜测可能是栈信息层数的上限;


traces.txt中的信息如下所示:

1 12    java.util.concurrent.ArrayBlockingQueue.insert(ArrayBlockingQueue.java:153)
        java.util.concurrent.ArrayBlockingQueue.offer(ArrayBlockingQueue.java:303)
        org.apache.flume.channel.file.LogFile$RandomReader.checkIn(LogFile.java:531)
        org.apache.flume.channel.file.LogFile$RandomReader.get(LogFile.java:496)
        org.apache.flume.channel.file.Log.get(Log.java:606)
        org.apache.flume.channel.file.FileChannel$FileBackedTransaction.doTake(FileChannel.java:523)
        org.apache.flume.channel.BasicTransactionSemantics.take(BasicTransactionSemantics.java:113)
        org.apache.flume.channel.BasicChannelSemantics.take(BasicChannelSemantics.java:95)
        org.apache.flume.sink.hdfs.HDFSEventSink.process(HDFSEventSink.java:374)
        org.apache.flume.sink.DefaultSinkProcessor.process(DefaultSinkProcessor.java:68)
        org.apache.flume.SinkRunner$PollingRunner.run(SinkRunner.java:147)
        java.lang.Thread.run(Thread.java:724)

1 4     sun.net.www.protocol.jar.JarURLConnection.connect(JarURLConnection.java:120)
        sun.net.www.protocol.jar.JarURLConnection.getInputStream(JarURLConnection.java:150)
        java.net.URLClassLoader.getResourceAsStream(URLClassLoader.java:233)
        javax.xml.parsers.SecuritySupport$4.run(SecuritySupport.java:94)

可见记录的都是java程序运行过程中的堆栈调用信息。然而这样的结果可读性比较差,我们可以使用java flame graph来将其转化为可读结果。


java flame graph是个非常讨巧的设计。它本身不支持堆栈抽样,但是它能将抽样结果转化为特别容易理解的形式,及“火焰图”。先看一下效果:

里面各种红橙黄色没有什么意义,只是做区分用的。从最底下往上表示堆栈的层层调用。横向表明每个接口实际占用的CPU时间。我这个火焰图测试的是flume(不是flame graph)的测试结果。可以看出有两块比较占用CPU时间的地方,分别是对磁盘的读操作和写操作。是不是很直观啊。

flame graph支持多种抽样器,这里我们先了解一下java flame graph的使用方法,这也是一种比较简单的使用方式。

在上述lightweight java profiler中,我们提到抽样器生成的结果是一个很难看懂的traces.txt,而在使用java flame graph的时候,只要以下命令:

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

然后会生成一个traces.svg,调用浏览器打开就是上面那个图的样子了。这是个矢量图,所以可以随意扩大缩小;在全图下看不清的底层堆栈信息,放大到一定程度后都能看的清清楚楚。

© 著作权归作者所有

共有 人打赏支持
dokia
粉丝 2
博文 29
码字总数 36553
作品 0
海淀
程序员
9 个帮助你进行Java性能调优的工具

NetBeans Profiler NetBeans Profiler is found in NetBeans The NetBeans profiler is a modular add on which is used to provide the profiling functionality for the NetBeans IDE, whi......

ihaolin
2014/06/16
0
0
从分析async-profiler的实现细节来学习jvmti

作者: 一字马胡 转载标志 【2017-12-22】 更新日志 厉害的内容分享 在上一篇文章中分享了一个用于分析java应用性能的厉害角色:async-profiler,具体的内容可以参考Java应用性能分析工具:a...

疼丸李白
2017/12/22
0
0
Java应用性能分析工具:async-profiler

作者: 一字马胡 转载标志 【2017-12-15】 更新日志 厉害的内容 及时对项目进行性能检测,并且分析检测结果数据,发现热点代码是一项充满意义的工作,因为可能因为某一段热点代码会拖慢整个系...

疼丸李白
2017/12/15
0
0
常用Java性能测试工具的分析与对比

虽然市场上的 Java Profiler 工具有不少,但是基本功能大多相似,本节首先对这些基本功能进行介绍。 遥测(Telemetry):遥测是一种用来查看应用程序运行行为的最简单的方法。通常会有多个视...

lanmeimei
2014/03/18
0
0
Java调用Keras、Tensorflow模型

实现python离线训练模型,Java在线预测部署。查看原文 目前深度学习主流使用python训练自己的模型,有非常多的框架提供了能快速搭建神经网络的功能,其中Keras提供了high-level的语法,底层可...

ioiogoo
04/03
0
0
从java1到java9每个版本都有什么新特性?五分钟了解

     其实,我是个标题党,没有java1的说法,java9的新特性我也没总结。所以,来个关注吧,说不定哪天就出了呢。。。   每次出新版本,大家大概都会这么问,“Java X会有什么特性呢?”...

java进阶架构师
2017/11/13
0
0
一句话讲清楚什么是JavaEE

摘要: Java技术不仅是一门编程语言而且是一个平台。同时Java语言是一门有着特定语法和风格的高级的面向对象的语言,Java平台是Java语言编写的特定应用程序运行的环境。Java平台有很多种,很多...

qq592fbb5b34ad7
07/02
0
0
一句话讲清楚什么是JavaEE

Java技术不仅是一门编程语言而且是一个平台。同时Java语言是一门有着特定语法和风格的高级的面向对象的语言,Java平台是Java语言编写的特定应用程序运行的环境。Java平台有很多种,很多的Jav...

qq58edeba279279
06/26
0
0
【J2EE】之常用的接口和协议

前言 初接触J2EE,会遇到很多之前没有遇到过的术语,下面我们来简单地汇总一下这些接口和协议吧。 各大接口和协议详解 JDBC 1.定义:Java数据库连接 2.地位:用于Java应用程序连接数据库的标...

m18633778874
04/26
0
0
java Native Method初涉

今天花了两个小时把一份关于什么是Native Method的英文文章好好了读了一遍,以下是我依据原文的理解。 一. 什么是Native Method 简单地讲,一个Native Method就是一个java调用非java代码的接...

风一样
2012/10/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Mybatis收集配置

一、Mybatis取Clob数据 1、Mapper.xml配置 <resultMap type="com.test.User" id="user"> <result column="id" property="id"/> <result column="json_data" property="jsonData" ......

星痕2018
10分钟前
0
0
centos7设置以多用户模式启动

1、旧版本linux系统修改inittab文件,在新版本执行vi /etc/inittab 会有以下提示 # inittab is no longer used when using systemd. # # ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON......

haha360
41分钟前
0
0
OSChina 周日乱弹 —— 红薯,五年间我对你不离不弃

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ andonny :分享周二珂的单曲《孤独她呀》 《孤独她呀》- 周二珂 手机党少年们想听歌,请使劲儿戳(这里) @孤星闵月 :没事干,看一遍红楼梦...

小小编辑
47分钟前
98
8
Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式 Factory工厂模式 Singleton单例模式 Delegate委派模式 Strategy策略模式 Prototype原型模式 Template模板模式 Spring5 beans 接口实例化 代理Bean操作 ...

小致dad
今天
0
0
SpringBoot | 第十章:Swagger2的集成和使用

前言 前一章节介绍了mybatisPlus的集成和简单使用,本章节开始接着上一章节的用户表,进行Swagger2的集成。现在都奉行前后端分离开发和微服务大行其道,分微服务及前后端分离后,前后端开发的...

oKong
今天
9
0
Python 最小二乘法 拟合 二次曲线

Python 二次拟合 随机生成数据,并且加上噪声干扰 构造需要拟合的函数形式,使用最小二乘法进行拟合 输出拟合后的参数 将拟合后的函数与原始数据绘图后进行对比 import numpy as npimport...

阿豪boy
今天
16
0
云拿 无人便利店

附近(上海市-航南路)开了家无人便利店.特意进去体验了一下.下面把自己看到的跟大家分享下. 经得现场工作人员同意后拍了几张照片.从外面看是这样.店门口的指导里强调:不要一次扫码多个人进入....

周翔
昨天
1
0
Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之...

路小磊
昨天
242
1
npm profile 新功能介绍

转载地址 npm profile 新功能介绍 npm新版本新推来一个功能,npm profile,这个可以更改自己简介信息的命令,以后可以不用去登录网站来修改自己的简介了 具体的这个功能的支持大概是在6这个版...

durban
昨天
1
0
Serial2Ethernet Bi-redirection

Serial Tool Serial Tool is a utility for developing serial communications, custom protocols or device testing. You can set up bytes to send accordingly to your protocol and save......

zungyiu
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部