You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过jdk.jfr.Recording API实现JDK Flight Recorder仅录制单个线程?

在JDK Flight Recording中仅录制单个线程的实现方案

如果你使用jdk.jfr.Recording API创建飞行录制,想要预先限制仅录制单个线程(而非事后在JMC中筛选),可以通过事件过滤机制实现,核心思路是基于线程ID对JFR事件做前置过滤,只保留目标线程的事件。

核心实现步骤

  1. 获取目标线程ID
    先拿到你需要录制的线程对象,通过其getId()方法获取唯一线程ID:

    // 假设targetThread是你要录制的目标线程实例
    long targetThreadId = targetThread.getId();
    // 如果录制当前线程,直接用:
    // long targetThreadId = Thread.currentThread().getId();
    
  2. 创建录制并添加线程过滤规则
    通过Recording.addFilter()方法,为所有事件(或指定事件类型)添加threadId匹配条件,只保留目标线程产生的事件:

    import jdk.jfr.Recording;
    import java.nio.file.Paths;
    
    try (Recording recording = new Recording()) {
        // 可选:配置录制的事件集(比如启用CPU采样、GC事件等)
        // recording.setSettings("jdk.CpuSample#enabled=true");
        // recording.setSettings("jdk.GarbageCollection#enabled=true");
    
        // 全局过滤:对所有事件生效,仅保留目标线程的事件
        recording.addFilter("*", "threadId == " + targetThreadId);
    
        // (可选)针对特定事件类型单独过滤,比如只过滤CPU采样事件
        // recording.addFilter("jdk.CpuSample", "threadId == " + targetThreadId);
    
        recording.start();
        // 等待目标线程执行完成,或按需控制录制时长
        targetThread.join();
        recording.stop();
        // 将录制结果导出到文件
        recording.dump(Paths.get("single-thread-recording.jfr"));
    } catch (Exception e) {
        e.printStackTrace();
    }
    

关键注意事项

  • 事件的threadId字段:JFR绝大多数内置事件(如jdk.CpuSample、jdk.ThreadSleep、jdk.MethodExecution)都自带threadId字段,可直接用于过滤;如果是自定义事件,需确保添加了@jdk.jfr.ThreadId注解的字段。
  • 过滤粒度控制:使用"*"作为事件名称时,会对所有启用的事件应用过滤;如果只需要录制特定类型的事件,可以指定具体的事件名称(如jdk.CpuSample),进一步缩小录制范围。
  • 按需录制适配:这种方式完全适配你多线程系统中按需录制长作业的场景,前置过滤会直接减少不必要的事件收集,显著降低录制文件大小,后续分析无需再手动筛选线程。

内容的提问来源于stack exchange,提问作者Philippe Marschall

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 22:37:46