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

为何JMC(JDK Mission Control)不显示虚拟线程相关事件?

问题背景

我有一个小型SpringBoot应用,包含一个RestController,其方法代码如下:

@GetMapping("/current-thread")
String currentThread() throws InterruptedException {
    var msg = new Msg();
    Thread.startVirtualThread(() -> {
                msg.s += Thread.currentThread().toString();
        }
    ).join();
    msg.s += Thread.currentThread().toString();
    return msg.s;
}

Msg类是一个简单的字符串包装类:

static class Msg{
    String s = new String();
}

运行应用后执行curl命令curl localhost:8081/current-thread,得到输出VirtualThread[#63]/runnable@ForkJoinPool-1-worker-1Thread[#38,http-nio-8081-exec-1,5,main],说明应用正常运行,每次请求都会创建虚拟线程。但通过JFR(JDK Flight Recorder)录制并在JMC(Java Mission Control)中查看时,仅能看到http-nio、ForkJoinPool-worker等平台线程,完全看不到虚拟线程的痕迹,也没有VirtualThreadStart、VirtualThreadEnd这类虚拟线程相关事件。我尝试从源码本地构建JMC,但问题依旧。

我的疑问:

  1. 是否有什么配置或操作被我遗漏了?
  2. JMC的该功能是否存在问题?(我使用了JMC 8.3.1,还本地构建了9.0版本)
  3. 是否有可行的解决办法?
解答

1. 可能遗漏的配置或操作

  • JDK版本不匹配:虚拟线程是Java 19引入的预览特性,Java 21才正式GA。如果应用运行在Java 19之前的版本,JFR根本不会生成虚拟线程相关事件;即使是Java 19/20,部分JFR事件可能处于预览状态,需要额外参数开启。
  • JFR录制未启用虚拟线程事件:默认的JFR录制配置(比如default)不会包含虚拟线程相关事件,需要手动勾选或使用包含这些事件的配置(比如profile配置可能包含部分,但仍需确认)。
  • 未检查正确的JMC视图:虚拟线程不会出现在传统的平台线程列表里,需要在JMC的「Events」标签页筛选VirtualThread*开头的事件,或者查看JMC 9中专门的虚拟线程视图。

2. JMC功能兼容性问题

  • JMC 8.x对虚拟线程支持有限:JMC 8.3.1发布时,虚拟线程还处于预览阶段,官方没有对其做完整适配,无法识别虚拟线程事件是正常情况。
  • 本地构建JMC 9仍有问题的原因:JMC 9需要搭配Java 19+的JDK运行,且构建时需确保依赖的JDK版本包含虚拟线程的JFR事件定义;如果构建环境用了低版本JDK,或者运行JMC时用了不支持虚拟线程的JDK,依然无法正常显示虚拟线程事件。

3. 可行解决办法

  • 升级到Java 21(LTS):这是最稳妥的方案,Java 21中虚拟线程正式稳定,JFR对其事件的支持也更完善,不存在预览特性的限制。
  • 手动配置JFR录制事件:
    录制时选择自定义配置,勾选所有VirtualThread相关事件(包括VirtualThreadStart、VirtualThreadEnd、VirtualThreadPark等);或者使用命令行启动录制时指定事件:
    java -XX:StartFlightRecording=filename=vt-recording.jfr,settings=profile,events=jdk.VirtualThreadStart,jdk.VirtualThreadEnd -jar your-springboot-app.jar
    
  • 确保JMC 9与Java 19+搭配使用:运行JMC 9时,指定使用Java 19及以上版本的JDK(比如设置JAVA_HOME为Java 21的路径),避免用低版本JDK启动JMC。
  • 检查JMC的事件筛选:打开JFR录制文件后,切换到「Events」标签页,在事件类型中搜索VirtualThread,即可看到对应的事件记录,里面包含虚拟线程的ID、生命周期信息等。

内容的提问来源于stack exchange,提问作者Java User

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 05:29:55