Java 飞行记录器未报告任何文件 I/O 事件

Java Flight Recorder is not reporting any File I/O events

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 - OpenJDK 11 on Ubuntu.

 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 操作。