为什么JMC(JDK Mission Control)不显示任何虚拟线程事件?

4

我有一个小的SpringBoot应用程序,其中包含1个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-nioForkJoinPool-worker线程。但我没有看到任何虚拟线程的迹象。它没有显示任何与虚拟线程相关的事件: 在JMC中没有虚拟线程事件。 我期望它显示1个VirtualThreadStart事件和1个VirtualThreadEnd事件。 我尝试从源代码构建JMC,但是我遇到了相同的问题。

我的问题:

  • 我有什么遗漏的吗?
  • 这个功能在JMC中不起作用吗?(我使用的是JMC 8.3.1,还从源代码本地构建了一个9.0版本。)
  • 有没有解决方法?

谢谢。

1个回答

2
Virtual Threads仍然是JDK 20中的一个预览功能,这意味着虚拟线程特定事件是实验性的,并且默认情况下不会在JMC GUI中显示。
此外,默认情况下禁用了一些虚拟线程特定事件,如虚拟线程启动和虚拟线程结束,以避免缓冲区被淹没。用户有可能在短时间内启动数百万个虚拟线程。
您可以下载JDK 21早期访问版本,其中这些事件不再是实验性的,并且可以通过命令行启用它们。
$ java -XX:StartFlightRecording:
    jdk.VirtualThreadStart#enabled=true,
    jdk.VirtualThreadEnd#enabled=true,
    filename=recording.jfr ...

在虚拟线程中发生的事件,例如 Socket 读取事件,应在不添加其他选项的情况下显示,假设持续时间超过 20 毫秒(默认阈值)。但是,在 JMC 的线程图页面中将无法看到它们。该页面仅显示平台线程。


1
非常感谢。你考虑了很多方面,甚至是我在问题中没有提到的方面。你关于阈值的线索对我很有帮助。我使用的是JDK 21的早期版本来运行应用程序,并且我正在使用JMC创建JFR记录。向导中有一个选项可以启用与虚拟线程相关的事件。我也这样做了。但是事件仍然不可见。对我有帮助的是关于阈值的线索。默认情况下,阈值为20毫秒。只有将其更改为0后,我才能看到它们。看起来这些事件发生得非常快,如果不超过阈值,就不会被记录下来。 - Java User
我还有一些问题,并且非常好奇 JMC、JFR、VisualVM 中与虚拟线程相关的特性。你知道 JMC 9.0 的计划动向吗?获取这样的信息最好的途径是什么?谢谢。 - Java User
1
您可能想要查看JMC项目页面(https://wiki.openjdk.org/display/jmc/Main)。其中包含JMC Slack频道和邮件列表的链接。 - Kire Haglin
感谢您的评论。我确实浏览了JMC项目页面,那里有许多有用的资源。Slack频道只对少数组织开放,我无法在那里注册。但是我已经订阅了JMC的邮件列表。虽然我不确定这个问题是否适合在邮件列表中提问,但我还是会尝试一下。 - Java User

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接