使用 Jrockit 的 Java JFR 转储的 JMC 解析器

JMC parser for Java JFR dumps using Jrockit

我了解到将 JFR 解析为 Java 可以通过使用来自 的 jrockit 的 JMC 解析器等不受支持的解析器来完成。我还认为在飞行记录期间会捕捉到很多事件。

如果我想从各种事件中检索数据值,例如事件选项卡下的堆栈跟踪、代码选项卡下的热方法、代码选项卡下的调用树等,我该如何过滤? Example image

例如,我能够使用 jfr-flame-graph 中提到的以下代码过滤调用树。

final String EVENT_TYPE = "Method Profiling Sample";
IView view = recording.createView();
for(IEvent event : view){
if(EVENT_TYPE.equals(event.getEventType().getName())){
  FLRStackTrace flrStackTrace = (FLRStackTrace) event.getValue("(stackTrace)");

在这里, 事件类型 - 方法分析示例;标识符 - (stacktrace);

所以如果我想检索 stacktrace/hot methods/etc 我需要捕获的 events/identifiers 是什么?有没有这方面的文件?

没有这方面的任何文档。如果你想提取堆栈跟踪,jfr-flame-graph 是一个很好的例子。 Events/Stack trace 和 Code/Hot Methods 之间的区别只是 Hot Methods 选项卡仅使用 Method Profiling Sample 事件,Events 选项卡更通用,将显示您在 Event Types 中选择的事件类型看法。 Code/Call 树与热方法相同,但 "upside down"。

要查看可用的其他事件,您可以使用 JMC UI。那里有一个称为设计器视图的功能(单击 Window/Show View/Designer)。如果您打开了记录,您可以使用红色停止按钮进入您感兴趣的选项卡的设计模式,然后右键单击感兴趣的组件以查看它使用的事件类型和属性。

JDK 9 有一个支持的解析器 API。

Path p = Paths.get("recording.jfr");
for (RecordedEvent event: RecordingFile.readAllEvents(p)) {
  System.out.println(event);
}

有关更完整的示例,请参阅 Javadoc http://docs.oracle.com/javase/9/docs/api/jdk/jfr/consumer/package-summary.html