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