首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在JDK 11中读取JFR

如何在JDK 11中读取JFR
EN

Stack Overflow用户
提问于 2020-11-10 18:27:43
回答 2查看 680关注 0票数 0

我使用Java Flight Recorder生成了一个jfr文件,并希望将其转换为与火焰图兼容的格式( https://github.com/brendangregg/FlameGraph )。是否有读取jfr文件的Java类。在java 7中,我们有

代码语言:javascript
复制
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/目录中看到Java任务控制

EN

回答 2

Stack Overflow用户

发布于 2020-11-11 06:41:34

如果您只想生成火焰图,则可以从JMC中为任何一组事件生成火焰图。只需下载JDK the的最新8.0EA版本,例如:https://adoptopenjdk.net/jmc

然后转到窗口->显示视图->任务控制/火焰视图。(暂时不能在Windows上运行。)

现在,表示事件选择的任何事物都将在该视图中呈现为Flame Graph。

您可以从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签入,就会更容易。

票数 3
EN

Stack Overflow用户

发布于 2020-11-11 00:42:06

JDK 11附带了一个API。

以下代码段打印最热门方法的直方图:

代码语言:javascript
复制
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 %s\n", e.getValue(), e.getKey()));
 }

接口参考:

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/

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64767104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档