You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 13:57:04