Java Flight Recorder 不报告任何文件 I/O 事件

标签 java jmc jfr

Java Flight Recorder 的一个广告功能是能够在 JMC 8.1 的文件 I/O 选项卡中报告创建、读取或强制的文件

为了测试此功能,我创建了一个小型应用程序,它使用 Apache commons-io 将大文件从源复制到目标。

public static void fileCopy(String srcPath ,String destPath) throws IOException {
    File inpFile = new File(srcPath);
    if(inpFile.exists() && inpFile.isFile()) {
        File destFile = new File(destPath);
        FileUtils.copyFile(inpFile, destFile);
    }
}

在使用配置文件模板启动 FlightRecoder 并观察 jfr 文件时,我在文件 I/O 模板中看不到任何事件,即使复制操作花费了 11 秒。

使用 JVM - Ubuntu 上的 OpenJDK 11。

Flight Recorder Screenshot

 java -XX:StartFlightRecording=name=benchmark,filename=benchmark.jfr,settings=profile -jar filecopyer-0.0.1-SNAPSHOT.jar 

我也在 profile.jfc 模板中将文件 IO 阈值更改为 0 ns 后重试,但仍然没有记录任何事件。

jdk.FileWrite、jdk.FileRead 和 jdk.FileForce 只捕获了 0 个事件。

但是我确实在 jdk.NativeMethodSample 下看到了事件,commons-io 最终调用了它。

github 上的示例应用程序: Profiled application

我做错了什么?

最佳答案

看起来 Apache Commons 似乎使用的 Files.copy 的实现依赖于异步 I/O 来进行复制。参见 sun.nio.fs.UnixCopyFile::copy(...)

JFR 目前不检测异步 I/O 操作。

关于Java Flight Recorder 不报告任何文件 I/O 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68896858/

相关文章:

java - JTable 在 Jframe 中不可见

java - 是否可以弃用 Java 枚举的某些值,如果可以,如何弃用?

java - 没有 JMC-Java Mission Controller-FlightRecorder 的 OpenJDK JDK11

jfr - RedHat OpenJDK 8 中的 JDK 飞行记录器向后移植

java - 在哪里可以下载 Java Mission Control(7)(OpenJDK11 或更高版本)?

java - 用 Volley 上传多张图片?

java - EMR 集群在 AWS 控制台 UI 上不可见

java - 在 JMC 控制台中打开 jfr 文件时出现错误

profiling - Java Mission Control (JMC) 6.0 在检查 JFR 飞行记录时不显示热门方法

Java 任务控制堆配置文件