JFR是否支持异步I/O?
我正在使用Java Flight Recorder(在HotSpot 1.8.0_144上)+Mission Control来对一个应用程序进行分析。
在Mission Control的File IO
选项卡中,我看到比我预期的和实际发生的"活动"要少几个数量级。
我真正看到的I/O "活动"似乎对应于同步文件I/O,但我不确定这是偶然还是我在JFR方面配置有误。
我尝试在一个更小的示例上运行,但似乎文件异步事件并没有被报告。
同步文件I/O事件已被报告
val inputStream = new FileInputStream("/home/cmhteixeira/Desktop/output.txt")
val outputStream = new FileOutputStream("/home/cmhteixeira/Desktop/output-copy.txt")
inputStream.transferTo(outputStream)
异步文件IO事件未被报告
RxIo(以下使用)是一个声称使用文件异步IO的库。
import org.javaync.io.AsyncFiles
import java.nio.file.Paths
val inputStream = Paths.get("/home/cmhteixeira/Desktop/output.txt")
val outputStream = Paths.get("/home/cmhteixeira/Desktop/output-copy.txt")
AsyncFiles
.readAllBytes(inputStream)
.thenCompose(bytes => AsyncFiles.writeBytes(outputStream, bytes))
.thenAcceptAsync(index => println("done")/* invoked on completion */)
在上述两种情况下,当通过Java Mission Control启动时,文件IO阈值
设置为0ns
。
问题
- 不支持文件异步IO吗?
- 异步套接字IO呢(我没有测试过)?
- 如果答案是否定的,那么社区对使用JFR的影响有多大?
- 感觉这是一个很大的缺点,但我缺乏了解背景,无法确定实际影响有多大。
SelectableChannel
和Selector
相关,后者与AsynchronousSocketChannel
,AsynchronousFileChannel
等相关。那么我假设JFR将不能捕获这两种事件之一? - cmhteixeira