Java Flight Recorder如何获取Recording录制数据的byte[]格式内容
可以直接获取byte[]格式的JFR录制数据,根据你使用的JDK版本可以选择不同的无外部依赖实现方案:
方案1:JDK 16及以上原生实现(最优,无任何额外依赖)
从JDK 16开始,Recording 类原生新增了writeTo(OutputStream)方法,无需写入磁盘,直接将录制数据写入内存输出流即可拿到字节数组,代码示例如下:
Configuration c = Configuration.getConfiguration("default"); Recording r = new Recording(c); r.start(); System.gc(); Thread.sleep(5000); r.stop(); // 直接写入内存流获取byte[] try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { r.writeTo(baos); byte[] jfrData = baos.toByteArray(); // 后续按需处理jfrData即可 }
该方案是官方原生提供的实现,性能最优,没有额外依赖,只要你使用的是JDK 16及以上版本优先选择该方案。
方案2:兼容JDK 11~15版本,内存FileSystem实现(无外部依赖)
如果你使用的是JDK 11到15的版本,没有原生的流写入方法,可以直接使用你提到的自定义内存FileSystem方案:将dump()方法的输出目标指定到内存文件系统的路径,直接读取内存中的文件内容即可得到byte[],全程不会接触磁盘,也不需要引入第三方依赖。
备选方案:临时文件中转(全版本兼容,无额外依赖)
如果对磁盘IO没有强制限制,也可以用临时文件中转实现,代码更简单,兼容所有支持JFR的JDK版本:
Configuration c = Configuration.getConfiguration("default"); Recording r = new Recording(c); r.start(); System.gc(); Thread.sleep(5000); r.stop(); Path tempFile = Files.createTempFile("tmp-recording", ".jfr"); try { r.dump(tempFile); byte[] jfrData = Files.readAllBytes(tempFile); // 后续按需处理jfrData即可 } finally { // 用完删除临时文件 Files.deleteIfExists(tempFile); }
内容的提问来源于stack exchange,提问作者czerny
相关产品推荐
相关产品推荐

