如何以编程方式解析 Oracle JDK 7 或 JDK8 中的 JFR 文件?

how to parse a JFR file in Oracle JDK7 or JDK8 programatically?

Oracle JDK14 和 JDK15 的 API 发布于 https://docs.oracle.com/en/java/javase/14/jfapi/parsing-recording-file.html 但我找不到 Oracle JDK8 的类似文档。

我想知道是否有人能够打印出使用 JDK8 收集的 JFR 文件的事件列表,就像 JDK14 和 JDK15 的文档中显示的示例一样。那么\jre\lib\jfr.jar文件的作用是什么?

解析示例中的 JFR 相关 类 自 Java 9 以来就存在,因此不可能在 Java 8 或更早版本中执行该示例(至少没有很多技巧).

jfr.jar 包含 Java 飞行记录器 runtime,因此它用于收集数据,而不是解析数据。

Oracle JDK 8 中的解析器 API 不受支持且未记录,但如果您只想将记录打印到标准输出,您可以尝试:

$ java oracle.jrockit.jfr.parser.Parser [-xml] <file>

如果您想在旧版本上做任何更复杂的事情,我会研究 JMC 解析器,它支持 Oracle JDK 8 和 JDK 9 中添加的新文件格式。

https://github.com/openjdk/jmc

JDK8 的代码由 Marcus 在外部站点发布:

import java.io.File;
import java.io.IOException;
import java.util.Iterator;

import oracle.jrockit.jfr.parser.*;

public class JDKParserTest {
    @SuppressWarnings("deprecation")
    public static void main(String[] args) throws IOException {
        File recordingFile = new File("C:\demo\wldf.jfr");
        Parser parser = new Parser(recordingFile);
        int count = 0;
        Iterator<ChunkParser> chunkIter = parser.iterator();
        while (chunkIter.hasNext()) {           
            ChunkParser chunkParser = chunkIter.next();
            for (FLREvent event : chunkParser) {
                count++;
                //System.out.println(event.toString());
            }
        }
        parser.close();
        System.out.println("Found " + count + " events");
    }
} 

这正是我构建自定义报告所需要的。 参考:http://hirt.se/blog/?p=446