我有一个小的SpringBoot应用程序,有1RestController,方法如下:

    @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飞行记录器)监视并通过JMC(Java任务控制)判断记录时,我确实看到了平台线程,即http-nioForkJoinPool-worker线程.但我没有看到任何虚拟线程的痕迹.它不显示任何与虚拟线程相关的事件: No virtual thread events in JMC.个 我预计它会显示1个VirtualThreadStart事件和1个VirtualThreadEnd事件. 我try 从源代码开始在本地构建JMC.但我确实看到了同样的问题.

我的问题:

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

谢谢.

推荐答案

在JDK 20中,虚拟线程仍然是preview feature,这意味着特定于虚拟线程的事件是实验性的,默认情况下不会显示在JMC图形用户界面中.

此外,默认情况下会禁用某些特定于虚拟线程的事件,如虚拟线程开始和虚拟线程结束,以避免淹没缓冲区.用户可能会在短时间内启动数百万个虚拟线程.

您可以下载JDK 21 early-access builds,其中的事件不再是试验性事件,并在命令行上启用它们:

$ java -XX:StartFlightRecording:
    jdk.VirtualThreadStart#enabled=true,
    jdk.VirtualThreadEnd#enabled=true,
    filename=recording.jfr ...

假设持续时间超过20ms(默认阈值),在虚拟线程中发生的事件(例如套接字读取事件)应该在没有其他选项的情况下被看到.但是,它们不会出现在JMC的线程图页面中.它只显示平台线程.

Java相关问答推荐

AWS Java SDK 2(putTarget)+ MinIO:不支持您提供的授权机制.请使用AWS 4-HMAC-SHA 256

'在使用apache poi生成Excel数据透视表时,行标签显示为第一列标题,并显示分类汇总

验证使用GCP生成的非对称密钥时签名不起作用

如何在Java中对自定义协议进行主机名验证?

Cucumber TestNG Assert失败,出现java. lang. Numbercycle异常

在AnyLogic中增加变量计数

Java自定义ThreadPool—暂停任务提交并取消当前排队任务

弹簧靴和龙目岛

Character::Emoji不支持带数字的字符吗?

为什么我们不能实现两个接口,其中一个接口有相同的签名,其中一个接口有默认的实现在java?'

Java中是否有某种类型的池可以避免重复最近的算术运算?

为什么我的在一个范围内寻找素数的程序不能像S所期望的那样工作

基于调车场算法的科学计算器

在AVL树的Remove方法中使用NoSuchElementException时遇到问题

将带有js文件的 bootstrap 程序导入maven项目时出错

在Spring终结点中,是否可以同时以大写和小写形式指定枚举常量?

如何集成语义发布和BitBucket(Java项目)

深度优先搜索实现:算法只向右搜索

JPA无手术同品种器械可能吗?

JavaFX:为什么我的ComboBox添加了一个不必要的单元格的一部分?