Java飞行记录器分析摘要提取

标签 java jvm jfr

我希望能够以文本格式提取通过分析 JFR 记录检测到的“热点”的某种摘要。准确地说,我想提取运行某些特定函数或某些特定类所产生的热点。像这样的事情:

<some tool> myfile.jfr --look-at-class='org/me/MyClass' --limit 10 --order-by self-time

并获取从 org.me 中的 MyClass 调用的最耗时的 10 个方法的表格。我尝试查看jfr命令行工具,但它没有这样的功能。或者,JMC只有图形界面,没有命令行界面。还有其他方法可以获得这样的结果吗?

最佳答案

使用 JFR Parsing API 可以轻松创建这样的工具。 .

import jdk.jfr.consumer.RecordingFile;

import java.nio.file.Paths;
import java.util.HashMap;

public class JfrTop {

    public static void main(String[] args) throws Exception {
        var fileName = args[0];
        var packageName = args.length > 1 ? args[1] : "";
        var top = args.length > 2 ? Integer.parseInt(args[2]) : 10;

        var hotMethods = new HashMap<String, Long>();
        long total = 0;

        try (var recording = new RecordingFile(Paths.get(fileName))) {
            while (recording.hasMoreEvents()) {
                var event = recording.readEvent();
                if (event.getEventType().getName().equals("jdk.ExecutionSample")) {
                    var stackTrace = event.getStackTrace();
                    if (stackTrace != null && stackTrace.getFrames().size() > 0) {
                        var method = stackTrace.getFrames().get(0).getMethod();
                        var className = method.getType().getName();
                        if (className.startsWith(packageName)) {
                            var fullName = className + '.' + method.getName() + method.getDescriptor();
                            hotMethods.compute(fullName, (key, val) -> val == null ? 1L : (val + 1));
                        }
                    }
                    total++;
                }
            }
        }

        double percent = 100.0 / total;
        hotMethods.entrySet().stream()
                .sorted((e1, e2) -> Long.compare(e2.getValue(), e1.getValue()))
                .limit(top)
                .forEachOrdered(e -> System.out.printf("%5.2f%% %s\n", e.getValue() * percent, e.getKey()));
    }
}

如何运行:

java JfrTop idea.jfr com.intellij.openapi.editor 10

示例输出:

20,35% com.intellij.openapi.editor.impl.RangeHighlighterTree$RHNode.recalculateRenderFlags()V
 4,20% com.intellij.openapi.editor.impl.IntervalTreeImpl.maxEndOf(Lcom/intellij/openapi/editor/impl/IntervalTreeImpl$IntervalNode;I)I
 3,19% com.intellij.openapi.editor.impl.IntervalTreeImpl.assertAllDeltasAreNull(Lcom/intellij/openapi/editor/impl/IntervalTreeImpl$IntervalNode;)V
 2,19% com.intellij.openapi.editor.impl.IntervalTreeImpl$IntervalNode.computeDeltaUpToRoot()I
 1,94% com.intellij.openapi.editor.impl.IntervalTreeImpl.pushDelta(Lcom/intellij/openapi/editor/impl/IntervalTreeImpl$IntervalNode;)Z
 1,63% com.intellij.openapi.editor.impl.IntervalTreeImpl$IntervalNode.hasAliveKey(Z)Z
 1,50% com.intellij.openapi.editor.impl.IntervalTreeImpl.correctMax(Lcom/intellij/openapi/editor/impl/IntervalTreeImpl$IntervalNode;I)V
 1,31% com.intellij.openapi.editor.impl.IntervalTreeImpl$1.hasNext()Z
 0,88% com.intellij.openapi.editor.impl.IntervalTreeImpl$IntervalNode.tryToSetCachedValues(IZI)Z
 0,63% com.intellij.openapi.editor.impl.IntervalTreeImpl.findOrInsert(Lcom/intellij/openapi/editor/impl/IntervalTreeImpl$IntervalNode;)Lcom/intellij/openapi/editor/impl/IntervalTreeImpl$IntervalNode;

关于Java飞行记录器分析摘要提取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61324185/

相关文章:

java - Ram + Swap JVM 争论/工具?

jvm - 尝试开始 JFR 记录时出现 AttachNotSupportedException

java - 在 ImagePanel 上绘制形状

java - HyperLedger Fabric 网络 Chaincode 实例化错误

java - 编译/运行java文件时我应该把-cp放在哪里

java - 如何测试执行另一个可运行的可运行

Java 类加载器和内存管理

java - java中如何在两个JVM之间传递对象?

Java 任务控制堆配置文件

java - JMC 飞行记录仪不显示自定义方法