4

Java Flight Recorder现在是 OpenJDK 11 的一部分,并提供自定义事件的使用。成功录制后,我想重用事件中的信息(尤其是我自己的自定义事件),但不知何故我无法读取事件的字段内容。我只能看到字段的注释、名称和类型。

有人知道这是否真的可能吗?

JFR 有一个消费者包,它允许您从文件中读取信息。我已经应用了一些功能。

我已经尝试过的

首先,我访问事件的所有字段:

event.getFields();

然后我遍历字段并以几种不同的方式访问它们的值:

a) eventField.getDescriptor();
b) eventField.getContentType();

光看他们的名字,显然他们都不会给我内容。不幸的是,我找不到任何可以提供帮助的功能。

我也尝试过

我还尝试了一个非常直接的想法:以调试方式阅读内容。我认为它会给我一些关于如何以编程方式提取这些信息的见解。

不幸的是,JFR设法以某种方式对他们的记录进行编码,在调试过程中,人们无法读取信息,直到以编程方式提取它们并将其作为局部变量(例如:地图)。

供您参考,我一直在使用指令来实现自定义事件。

4

1 回答 1

1

这是一个简短的程序,说明如何获取值

public class Example {
  public static void main(String[] args) throws IOException {
  if (args.length != 1) {
    System.err.println("Must specify a recording file.");
    return;
  }

  List<RecordedEvent> events = RecordingFile.readAllEvents(Path.of(args[0]));
  for (RecordedEvent event : events) {
    EventType eventType = event.getEventType();
    String name = eventType.getName();
    Instant start = event.getStartTime();
    Instant end = event.getEndTime();
    System.out.println(name + " " + start + " - " + end);
    for (ValueDescriptor field : eventType.getFields()) {
      String fieldName = field.getName();
      Object value = event.getValue(fieldName);
      System.out.println(fieldName + " = " + value);
    }
    System.out.println();
  }
}

如果要查找 JFR 各方面的示例代码,可以在OpenJDK 项目中的test 文件夹中查找。比如一个RecordedEvent的测试

于 2020-07-12T13:54:55.633 回答