前言

立的flags倒了太多次
自己还是太菜了..
课题太大, 自己简单总结一下.
要是自己总结错了.
就不收费, 错就错了 !-_-!

第一步准备环境

一定要设置对java的HOME以及PATH路径.
如果 which java 不在 自己定义的PATH里面,建议改名.
避免程序出奇奇怪怪的问题.
which java
可以执行命令
mv /usr/bin/java /usr/bin/java2
创建环境变量.
cat > /etc/profile.d/java.sh <<EOF
export PATH=$PATH:/gscloud/server/runtime/java/x86_64-linux/bin
export JAVA_HOME=/gscloud/server/runtime/java/x86_64-linux
EOF source /etc/profile.d/java.sh
# 注意这里面是我的产品的环境变量.
使用 java -version
确认java的路径是正确的. 版本号也是正常的.

第二步下载相关资源

  • 注意这里我学习的非常弱鸡.
  • 感谢 Brendan Gregg
async-profiler
honest-profiler
lightweight-java-profiler
FlameGraph

第三步各种命令学习

这里掌握的非常浅层. 只能是简单记录,其他的真白瞎.
async-profiler 功能帮助:
Usage: ./profiler.sh [action] [options] <pid>
Actions:
start start profiling and return immediately
resume resume profiling without resetting collected data
stop stop profiling
dump dump collected data without stopping profiling session
check check if the specified profiling event is available
status print profiling status
meminfo print profiler memory stats
list list profiling events supported by the target JVM
collect collect profile for the specified period of time
and then stop (default action)
Options:
-e event profiling event: cpu|alloc|lock|cache-misses etc.
-d duration run profiling for <duration> seconds
-f filename dump output to <filename>
-i interval sampling interval in nanoseconds
-j jstackdepth maximum Java stack depth
-t profile different threads separately
-s simple class names instead of FQN
-g print method signatures
-a annotate Java methods
-l prepend library names
-o fmt output format: flat|traces|collapsed|flamegraph|tree|jfr
-I include output only stack traces containing the specified pattern
-X exclude exclude stack traces with the specified pattern
-v, --version display version string --title string FlameGraph title
--minwidth pct skip frames smaller than pct%
--reverse generate stack-reversed FlameGraph / Call tree --loop time run profiler in a loop
--alloc bytes allocation profiling interval in bytes
--live build allocation profile from live objects only
--lock duration lock profiling threshold in nanoseconds
--total accumulate the total value (time, bytes, etc.)
--all-user only include user-mode events
--sched group threads by scheduling policy
--cstack mode how to traverse C stack: fp|dwarf|lbr|no
--begin function begin profiling when function is executed
--end function end profiling when function is executed
--ttsp time-to-safepoint profiling
--jfrsync config synchronize profiler with JFR recording
--lib path full path to libasyncProfiler.so in the container
--fdtransfer use fdtransfer to serve perf requests
from the non-privileged target

注意最后还会有几个样例

Example: ./profiler.sh -d 30 -f profile.html 3456
./profiler.sh start -i 999000 jps
./profiler.sh stop -o flat jps
./profiler.sh -d 5 -e alloc MyAppName

最简单的打印火焰图的方法

可以在PATH里面加上profiler.sh 所在的目录 然后执行命令如下:
profiler.sh -d 60 -f /root/zhaobsh.html `jps |grep caf |head -n 1 |awk '{print $1}'`
简介介绍
-d duration 持续时间, 单位秒钟
-f 执行结果的文件路径. 注意文件后缀很重要, 只有html的才会解析成火焰图. 其他可能不会解析.
最后面放上pid

查看其他的火焰图

profiler.sh -d 10 -e alloc  -f /root/profiler_alloc.html  `jps |grep caf |head -n 1 |awk '{print $1}'`
profiler.sh -d 10 -e lock -f /root/profiler_lock.html `jps |grep caf |head -n 1 |awk '{print $1}'`
profiler.sh -d 10 -e cache-misses -f /root/profiler_cache-misses.html `jps |grep caf |head -n 1 |awk '{print $1}'`
-e 指定监控的时间. alloc 应该是监控内存分配
- lock监控锁的情况
- cache-miss 监控缓存失败的部分.

注意profiler可以支持的event主要如下

可以使用 profier.sh list 的方式进行查看
Basic events:
cpu
alloc
lock
wall
itimer
Java method calls:
ClassName.methodName
Perf events:
page-faults
context-switches
cycles
instructions
cache-references
cache-misses
branch-instructions
branch-misses
bus-cycles
L1-dcache-load-misses
LLC-load-misses
dTLB-load-misses
rNNN
pmu/event-descriptor/
mem:breakpoint
trace:tracepoint
kprobe:func
uprobe:path

honest-profiler 的简单使用

解压缩后会有几个文件
console
gui
honest-profiler.jar
liblagent.so 可以通过agent的方式进行拉取
感觉这种方式比较复杂.

agent的方式运行

java -agentpath:/honest-profiler/liblagent.so=interval=7,
logPath=/tmp/log.hpl -cp Cpu-0.0.1-SNAPSHOT.jar 注意需要使用绝对路径指向 honest-profiler指定的路径

结果分析

记得服务不停止 不会产生具体的文件
分析需要使用 flamegraph的角度尽心分析.
主要命令如下:
第一步需要折叠一下对应的结果 便于flamegraph进行分析
java -cp /honest-profiler/honest-profiler.jar
com.insightfullogic.honest_profiler.ports.console.FlameGraphDumperApplication
/tmp/log.hpl /tmp/log.folded
第二步进行flamegraph的分析
/FlameGraph/flamegraph.pl /tmp/log.folded > /tmp/flamegraph-java.svg # 注意这里的命令学习自:
https://zhuanlan.zhihu.com/p/374861737
这个命令我并没有非常严格的去学习与验证 (连续两天熬夜 困死了..)

第四部分: 火焰图的解读

y 轴表示调用栈,每一层都是一个函数。
调用栈越深,火焰就越高,顶部就是正在执行的函数,
下方都是它的父函数。
x 轴表示抽样数,如果一个函数在
x 轴占据的宽度越宽,就表示它被抽到的次数多,
即执行的时间长。注意,x 轴不代表时间,
而是所有的调用栈合并后,按字母顺序排列的。 火焰图就是看顶层的哪个函数占据的宽度最大。
只要有"平顶"(plateaus),就表示该函数可能存在性能问题。
注意:颜色没有特殊含义

解读


解读

最顶层的函数g()占用 CPU 时间最多。
d()的宽度最大,但是它直接耗用 CPU 的部分很少。
b()和c()没有直接消耗 CPU。
因此,如果要调查性能问题,首先应该调查g(),其次是i()。 另外,从图中可知a()有两个分支b()和h(),
这表明a()里面可能有一个条件语句,而b()分支消耗的 CPU 大大高于h()。
————————————————
Study From https://blog.csdn.net/Ziputi/article/details/118882851
其实都是从 Brendan Greeg那边学到的.

Java火焰图简单学习的更多相关文章

  1. Java火焰图在Netflix的实践

    转自 http://www.infoq.com/cn/news/2015/08/java-flamegraph 亲爱的读者:我们最近添加了一些个人消息定制功能,您只需选择感兴趣的技术主题,即可获取重要 ...

  2. 转发 Java火焰图在Netflix的实践

    为了分析不同软件或软件的不同版本使用CPU的情况,相关设计人员通常需要进行函数的堆栈性能分析.相比于定期采样获得数据的方式,利用定时中断来收集程序运行时的PC寄存器值.函数地址以及整个堆栈轨迹更加高效 ...

  3. java 命令对象简单学习实现:

    命令模式:首先我们要知道命令模式的基本定义:来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化.用于“行为请求者”与“行为实现者”解耦,可实现二者之间的松耦合,以便适应变化.分离变化 ...

  4. UML类图简单学习 各种对象、关系UML表示法

    <大话设计模式>上面的UML类图: 类的UML表示 动物 的矩形框 表示是一个类. 类图分为三层,第一层显示类的名称,如果是抽象类,则用斜体表示:第二层是类的特性,通常就是类的字段和属性: ...

  5. Java反射机制简单学习

    java中除了基本数据类型,几乎都为对象.例如 Person p=new Person(); 这句语句表明了p是Person类的一个实例对象.但其实,Person也是一个实例对象,它是Class类的实 ...

  6. Java中StringBuffer 简单学习,LeetCode中1323题运用

    StringBuffer 学习 StringBuffer() 构造一个没有字符的字符串缓冲区,初始容量为16个字符. deleteCharAt(int index) 删除char在这个指定序列inde ...

  7. Java程序性能定位工具-火焰图

    Java程序性能定位工具-火焰图 前言 Java火焰图是一种新的查看CPU利用率方式.今天就带大家一起使用来自Google大神的工具来生成火焰图.火焰图非常的直观,问题一目了然,希望有一天它能成为JA ...

  8. 使用linux perf工具生成java程序火焰图

    pre.cjk { font-family: "Nimbus Mono L", monospace } p { margin-bottom: 0.1in; line-height: ...

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

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

  10. 超好用的自带火焰图的 Java 性能分析工具 Async-profiler 了解一下

    如果你经常遇到 Java 线上性能问题束手无策,看着线上服务 CPU 飙升一筹莫展,发现内存不断泄露满脸茫然.别慌,这里有一款低开销.自带火焰图.让你大呼好用的 Java 性能分析工具 - async ...

随机推荐

  1. 技术实践丨基于MindSpore的ResNet-50蘑菇“君”的识别应用体验

    本文分享自华为云社区<基于MindSpore的ResNet-50蘑菇"君"的识别应用体验>,原文作者:Dasming. 摘要:基于华为MindSpore框架的ResNe ...

  2. 教你如何优雅的改写“if-else”

    摘要:这些场景,你是怎么写的代码? if-else,这是个再正常不过的coding习惯,当我们代码量小的时候用来做条件判断是再简单不过的了.但对于优秀程序员来说,这却不是好代码. 不信你往下看- 1. ...

  3. JDK1.6中String类的坑,快让我裂开了…

    摘要:JVM优化的目标就是:尽可能让对象都在新生代里分配和回收,尽量别让太多对象频繁进入老年代,避免频繁对老年代进行垃圾回收,同时给系统充足的内存大小,避免新生代频繁的进行垃圾回收. 本文分享自华为云 ...

  4. OpenHarmony移植案例:如何适配服务启动引导部件bootstrap_lite

    摘要:本文介绍了startup子系统之bootstrap_lite服务启动引导部件的移植适配案例及原理. 本文分享自华为云社区<OpenHarmony移植案例与原理 - startup子系统之b ...

  5. 音乐 APP 用户争夺战,火山引擎 VeDI 助力用户体验升级!

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群 国内数字音乐市场正在保持稳定增长. 根据华经产业研究院数据报告显示,2020 年数字音乐市场规模为 357.3 亿元,到 ...

  6. CPU推理|使用英特尔 Sapphire Rapids 加速 PyTorch Transformers

    在 最近的一篇文章 中,我们介绍了代号为 Sapphire Rapids 的第四代英特尔至强 CPU 及其新的先进矩阵扩展 (AMX) 指令集.通过使用 Amazon EC2 上的 Sapphire ...

  7. 携程OceanBase开源实践——索引统计功能实现

    [作者] 施纬,携程数据库研发工程师,主要负责数据库运维和内核研发. 姜贤富,携程高级数据库研发工程师,主要负责携程数据库监控运维及工具研发,拥有十年运维经验. [概述] 自从2021年OceanBa ...

  8. MP4 视频“只闻其声,不见其人”,是怎么回事呢?

    艾瑞巴蒂大家好,我二狗子又来啦!这段时间关于疫情的好消息不断,各个地区的疫情都得到了有效的控制,做到了新增病例个位数增长甚至连续多天零增长!这不,二狗子也终于可以出村回到大城市上班啦!由于要坐很久的火 ...

  9. Linux 网络收包流程

    哈喽大家好,我是咸鱼 我们在跟别人网上聊天的时候,有没有想过你发送的信息是怎么传到对方的电脑上的 又或者我们在上网冲浪的时候,有没有想过 HTML 页面是怎么显示在我们的电脑屏幕上的 无论是我们跟别人 ...

  10. Codeforces Round #617 (Div. 3) A~E

    比赛链接:Here 1296A. Array with Odd Sum 题意:给了 \(n\) 个数,现在就是说可以选择两个数让其中一个的值等于另一个的值. 这种操作无限次 问是不是能让这n个数操作后 ...