我使用Java飞行记录器生成了一个jfr文件,我想将其转换为与火焰图兼容的格式(https://github.com/brendangregg/FlameGraph(。是否有任何Java类可以读取jfr文件。在java7中,我们有
import com.jrockit.mc.common.IMCFrame;
import com.jrockit.mc.common.IMCMethod;
import com.jrockit.mc.flightrecorder.FlightRecording;
import com.jrockit.mc.flightrecorder.FlightRecordingLoader;
import com.jrockit.mc.flightrecorder.internal.model.FLRStackTrace;
import com.jrockit.mc.flightrecorder.spi.IEvent;
import com.jrockit.mc.flightrecorder.spi.IEventType;
import com.jrockit.mc.flightrecorder.spi.IField;
import com.jrockit.mc.flightrecorder.spi.IView;
但我想知道JDK 11中有没有其他选择,我在/lib/directory 中没有看到Java任务控制
JDK 11附带了一个API。
以下片段打印了最热门方法的直方图:
public static void main(String[] args) throws IOException {
if (args.length != 1) {
System.err.println("Must specify a recording file.");
return;
}
RecordingFile.readAllEvents(Path.of(args[0])).stream()
.filter(e -> e.getEventType().getName().equals("jdk.ExecutionSample"))
.map(e -> e.getStackTrace())
.filter(s -> s != null)
.map(s -> s.getFrames().get(0))
.filter(f -> f.isJavaFrame())
.map(f -> f.getMethod())
.collect(
Collectors.groupingBy(m -> m.getType().getName() + "." + m.getName() + " " + m.getDescriptor(),
Collectors.counting()))
.entrySet()
.stream()
.sorted((a, b) -> b.getValue().compareTo(a.getValue()))
.forEach(e -> System.out.printf("%8d %sn", e.getValue(), e.getKey()));
}
API参考:
https://docs.oracle.com/en/java/javase/15/docs/api/jdk.jfr/jdk/jfr/consumer/package-summary.html
"飞行记录器API程序员指南":
https://docs.oracle.com/en/java/javase/14/jfapi/
如果您只想生成一个火焰图,您可以对JMC中的任何一组事件执行此操作。只需下载JDK Mission Control的最新8.0 EA版本,例如:https://adoptopenjdk.net/jmc
然后转到窗口->显示视图->任务控制/火焰视图。(目前还不能在Windows上运行。(
现在,任何表示事件选择的东西都将在该视图中渲染为火焰图。
您可以从中获取生成火焰图的代码https://github.com/openjdk/jmc(结账https://github.com/openjdk/jmc/blob/master/application/org.openjdk.jmc.flightrecorder.flameview/src/main/java/org/openjdk/jmc/flightrecorder/flameview/tree/TraceTreeUtils.java例如(,不过如果你等一两周,一次会更容易https://bugs.openjdk.java.net/browse/JMC-6787已签入。