未读代码 未读代码
首页
  • Java 18 新功能介绍
  • Java 17 新功能介绍
  • Java 16 新功能介绍
  • Java 15 新功能介绍
  • Java 14 新功能介绍
  • Java 8 新特性

    • Java 8 Lambda 表达式
    • Java 8 Stream 流式操作
    • Java 8 时间处理介绍
    • Java 8 Optional 介绍
  • Java 开发工具
Java 源码分析
Spring Boot 系列
  • Arthas 问题定位
  • JMH 基准测试
GitHub (opens new window)
首页
  • Java 18 新功能介绍
  • Java 17 新功能介绍
  • Java 16 新功能介绍
  • Java 15 新功能介绍
  • Java 14 新功能介绍
  • Java 8 新特性

    • Java 8 Lambda 表达式
    • Java 8 Stream 流式操作
    • Java 8 时间处理介绍
    • Java 8 Optional 介绍
  • Java 开发工具
Java 源码分析
Spring Boot 系列
  • Arthas 问题定位
  • JMH 基准测试
GitHub (opens new window)
  • Java 性能分析

    • Java 性能分析与优化导读
    • Arthas - Java 线上问题定位处理的终极利器
    • Java 中的监控与管理原理概述
    • JMX 监控和管理 Java 程序
    • JMC 使用教程
    • JFR 使用教程
      • JFR 启动记录
      • JFR 分析内存
      • JFR 分析CPU
      • JFR 分析网络
      • JFR 分析 IO
    • JMH - Java 代码性能基准测试
    • Async-Profiler - Java 火焰图性能分析工具
    • Java 中的5个代码性能提升技巧,最高提升近10倍
  • Java 性能分析
  • Java 性能分析
程序猿阿朗
2023-03-15

JFR 使用教程

JFR 飞行记录器是 JMC 中最重要的工具之一,它可以捕获Java应用程序在运行时的性能数据,包括线程活动、CPU使用情况、内存使用情况、网络流量等,然后将这些数据保存到文件中。然后开发人员可以使用 JMC 或者命令工具分析这个数据,帮助排查性能问题。

为了方便演示,编写一段测试代码,有下面几个方法。

  1. cpuHigh 方法,不断地做浮点运算,消耗 CPU 性能。
  2. allocate 方法,不断地分配 BigDecimal 对象,占用内存。
  3. readFile 方法,不断地读取文件内容,消耗 IO 资源。

一如既往,文章测试代码地址:https://github.com/niumoo/JavaNotes/blob/master/tool-java-hotcode/src/main/java/com/wdbyte/hotcode/HotCode.java (opens new window)

下面介绍使用 JFR 可以分析几种常见问题。

# JFR 启动记录

可以使用 JMC 直接设定捕获一段时间内的 JFR 记录。

JFR 记录

使用 JFR 记录了指定时长的数据后,会生成一个 .jfr 的数据文件,并自动打开 JMC 的 JFR 分析页面。如下图。

JFR 主页面

除此之外,还可以使用命令 jcmd 捕获一段时间的 JFR 记录。

➜  develop jps
32437 Jps
31510 HotCode
➜ jcmd 31510 JFR.dump name=1 filename=./recording.jfr
31510:
No recordings to dump from. Use JFR.start to start a recording.
➜ jcmd 31510 JFR.start delay=5s duration=20s settings=profile filename=/Users/darcy/recording.jfr
31510:
Recording 3 scheduled to start in 5 s. The result will be written to:

/Users/darcy/recording.jfr
➜ jcmd 31510 JFR.check
31510:
Recording 3: name=3 duration=20s (running)
➜ jcmd 31510 JFR.check
31510:
No available recordings.

Use jcmd 31510 JFR.start to start a recording.
➜  develop ll ~/ | grep jfr
-rw-r--r--    1 darcy  staff   2.0M  3 14 20:22 recording.jfr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

上面的示例中,要进行 JFR 转存的进程为 31510,记录时长 20s,并保存到 /Users/darcy/recording.jfr 文件中。

# JFR 分析内存

在 JFR 的内存页面,可以看到类的内存占用情况,因为测试代码中在不断地分配 BigDecimal 对象到 List ,这里也可以看到 java.match.BigDecimal 对象占用了较多内存。

并且在下方的 Flame View 视图中还能看分配调用堆栈,可以看到是 allocate 方法分配过来的。

JFR 内存

在内存的活动对象页面,可以进一步查看活动对象的内存占用来源,如果继续看 BigDecimal 对象的话,可以看到它的堆栈信息,以及所在线程名称为 memory_allocate_thread。

JFR 内存活动对象

# JFR 分析CPU

在方法概要分析中,可以简单看到某些操作使用了产生了多少事件,事件产生较多的线程可以从侧面说明它也占用了较多的 CPU 资源。

JFR 方法概要分析

这个图中可以看到 cpuHigh 方法产生了最多的事件,所在的线程为 cpu_high_thread,从 Flame View 中还可以看到调用的堆栈信息。

# JFR 分析网络

通过套接字I/O 页面可以看到网络传输情况,因为在测试代码中不涉及网络传输,所以这里捕获到的只有 JMC 和 JFR 与进程通信的 RMI 协议信息。

JFR 套接字

# JFR 分析 IO

通过 文件 I/O 页面可以查看进程的 I/O 操作情况,在示例代码中,启动了 readFile 方法不断地读取文件内容,从下面的截图中可以看到在不断地读取 info.txt 文件,现成名称为 read_file_method。

JFR IO

订阅

文章持续更新,订阅可以关注「 程序猿阿朗 」公众号或者未读代码博客。

文章作者: 程序猿阿朗
文章链接:https://www.wdbyte.com/java/performance/jfr.html
版权声明:本网站当前文章采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 未读代码!
#jfr
上次更新: 2023/03/15, 09:22:31
JMC 使用教程
JMH - Java 代码性能基准测试

← JMC 使用教程 JMH - Java 代码性能基准测试→

最近更新
01
JMC 使用教程
03-15
02
你好 ChatGPT, 帮我看下这段代码有什么问题?
02-14
03
如何搭建一个自己的音乐服务器
12-04
更多文章>

提示:评论前请刷新页面,否则评论的可能不是当前文章。

Theme by Vdoing | Copyright © 2018-2023 程序猿阿朗 | MIT License | 皖ICP备20000567号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式