Java 19虚拟线程实战与性能分析

news2025/1/12 8:40:39

Java 19推出了新特性“虚拟线程”,类似于Go语言中的协程。它是传统线程的不同之处在于,它是一种用户模式(user-mode)的线程。

虚拟线程是由 JDK 而非操作系统提供的线程的轻量级实现:

虚拟线程是没有绑定到特定操作系统线程的线程。

平台线程是以传统方式实现的线程,作为围绕操作系统线程的简单包装。

下面让我们实际开发一个多线程的程序,分别使用传统线程和虚拟线程,再来对比一下它们运行期间的性能表现。

该程序会创建10万个线程,每个线程并发运行(先睡眠一秒,再打印一个数字),运行完之后打印运行时间

传统线程程序

public class OSThreadMain {
    public static void main(String[] args) throws InterruptedException, IOException {
        TimeUnit.SECONDS.sleep(60);
        AtomicInteger count = new AtomicInteger();
        long start = System.currentTimeMillis();
        try (var executor = Executors.newCachedThreadPool()) {
            IntStream.range(0, 100000).forEach(i -> {
                executor.submit(() -> {
                    System.out.println("参数" + (count.getAndIncrement()));
                    Thread.sleep(Duration.ofSeconds(1));
                    return i;
                });
            });
        }
        System.out.println("耗时" + (System.currentTimeMillis() - start));
        System.in.read();
    }
}

该代码中使用了线程池。

运行结果

可见整体运行时间达到了38秒多。

同时我用JConsole连接了程序,得到的监控图像

可以看出,整个程序运行过程中,比较突出的资源使用是线程数和CPU占用率,线程数达到了将近4000个线程,并持续了程序运行的大部分有效时间(前面为了能让JConsole能先连接上程序再进行监测,程序首先睡了60秒)。同时CPU的占用率也在程序有效运行时间内保持在30%到40%之间。

下面再看虚拟线程代码

public class VirtualThreadMain {
    public static void main(String[] args) throws IOException, InterruptedException {
        TimeUnit.SECONDS.sleep(60);
        AtomicInteger count = new AtomicInteger();
        long start = System.currentTimeMillis();
        try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
            IntStream.range(0, 100000).forEach(i -> {
                executor.submit(() -> {
                    System.out.println("参数" + (count.getAndIncrement()));
                    Thread.sleep(Duration.ofSeconds(1));
                    return i;
                });
            });
        }
        System.out.println("耗时" + (System.currentTimeMillis() - start));
        System.in.read();
    }
}

除了使用了newVirtualThreadPerTaskExecutor方法代替newCachedThreadPool方法之外,代码完全相同。

运行结果

程序运行只花了4323毫秒,仅为传统线程的九分之一。再看JConsole监控结果

 

可见线程数仅为21个左右,而CPU占用率也仅是在一瞬间触达33%左右即迅速回落。可见在线程数和CPU占用率上,虚拟线程大大优于传统线程。

不过值得一提的是,从上两图可看出,传统线程内存占用仅150MB左右,而虚拟线程则为300MB左右,有两倍的差异。这是因为虚拟线程是JDK在用户模式实现,所以需要更复杂的数据结构去实现,而传统线程,则依赖于操作系统,所以JVM的内存占用就少了。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/94538.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mock.js的使用

初始化 //main.js中 import "/network/fake-message/index.js" //全局文件中引入虚假数据///network/fake-message/index.js //创建伪数据 import Mock from mockjs import { Random } from mockjs//获取商品列表 Mock.mock(/api\/goodlist/,get,{status:200,mess…

基于java+springmvc+mybatis+vue+mysql的高校课程评价系统

项目介绍 在还没有计算机的时代,对于教学评价的各方面的管理都是靠纸、笔为主要的工具进行的。随着科技的发展,大量信息增长,利用传统的方式已经无法快速、准确的跟随学校各项目的管理工作了。当人们意识到对于大量信息管理的重要性的时候&a…

第二十二章 染色法与匈牙利算法

第二十二章 染色法与匈牙利算法一、使用场景——二分图二、染色法1、算法原理2、代码模板(1)问题:(2)代码:(3)分析:三、匈牙利算法1、算法用途2、算法思路3、算法模板&am…

五个月学完软件测试,现在分享以前自学的测试笔记

以前学习手抄的linux命令哈哈哈 定义 在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。 测试就是发现错误而执行程序的过程。 原则 保证测试的覆盖度,但是穷举测试是不可能…

LVI-SAM坐标系外参分析与代码修改,以适配各种数据集

文章目录0.前言1.原作者传感器件坐标系定义与外参修改1.1.博客作者的讲解(仅供参考)1.2.LIO-SAM的README中作者对其传感器配置的解释1.3.IMU坐标系详解1.4.params_lidar.yaml中LIO外参修改1.4.1.作者给的参数注释问题1.4.2.自己修改代码2.LVI-SAM中的坐标…

Redis常见面试题(一)

目录 1、Redis是什么? 2、Redis有哪些应用场景? 3、Redis有什么优势? 4、Redis为什么这么快? 5、Redis主要消耗什么物理资源? 6、Redis为什么把所有数据放到内存中? 7、Redis命令是原子性的吗? 8、Redis磁盘快照操作是原子的吗? 9、Redis怎么测试连通性? 10、…

【图像去噪】均值+中值+空间+高斯滤波图像去噪【含GUI Matlab源码 763期】

⛄一、图像去噪及滤波简介 1 图像去噪 1.1 图像噪声定义 噪声是干扰图像视觉效果的重要因素,图像去噪是指减少图像中噪声的过程。噪声分类有三种:加性噪声,乘性噪声和量化噪声。我们用f(x,y)表示图像,g(x,y&#xff0…

四十六——

四十六、JavaScript——对象 一、对象 数据类型:原始值: 1. 数值 Number 2. 大整数 BigInt 3. 字符串 String 4. 布尔值 Boolean 5. 空值 Null 6. 未定义 Undefinded 7. 符号 Symbol 除了七种原始值之外,后面所用到的数据类型,都…

jsp+ssm计算机毕业设计茶园文化交流平台论文【附源码】

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JSPSSM mybatis Maven等等组成,B/S模式 Mave…

jsp+ssm计算机毕业设计超市收银系统论文【附源码】

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JSPSSM mybatis Maven等等组成,B/S模式 Mave…

【LeetCode101. 对称二叉树】—— 二叉树遍历

101. 对称二叉树 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true示例 2: 输入:root [1,2,2,null,3,null,3] 输出:false提示: …

【探索Spring底层】12.谈谈代理创建器与代理创建时机

文章目录1. 前言2. 谈谈代理创建器3. 代理创建时机是什么时候4. 浅谈Order的失效场景4. 浅谈Order的失效场景5. 高级切面如何转为低级切面1. 前言 Spring中有两种切面,一种是Aspect,另一种是Advisor 其中Aspect是高级切面,Advisor是低级切面…

【网站架构】网站系统怎么才是安全的?安全验收?等保、网络安全、SQL盲注、https、鉴权

大家好,欢迎来到停止重构的频道。 本期我们讨论网站系统的安全性。 安全的重要性不言而喻,大部分安全问题确实是安全扫描后根据指引修改就可以了。 但是仍有一些问题修改起来是特别麻烦的,这些问题会严重影响上线时间。 本期我们的重点不…

共享购模式简单又好玩,撑起市场的半边天,推动实体产业改造上级

在2022年1月18日,国家发展改革委等七部局下发《促进消费实施方案》的通知,确立了”消费送积分”的新形式。该政策的出台,表明了政府探索实施全国绿色消费积分制度,鼓励地方结合实际建立本地绿色消费积分制度,以兑换商品…

S3 Drive支持以及FIPS 140-2兼容性

S3 Drive支持以及FIPS 140-2兼容性 在Windows Arm64上运行-添加了在Microsoft Windows for Arm64上的功能。无需额外下载,安装程序将为您的系统选择正确的驱动程序和库。 现在符合FIPS 140-2。 现在,您可以使用新的CacheOnlyFiles设置阻止上载临时(或其他…

基于高分辨率时频分析的单通道地震数据自动噪声衰减方法(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 记录的地震信号常常被噪声破坏。本文使用了一种基于高分辨率时频分析的单通道地震数据自动噪声衰减方法。同步压缩是一种时频重…

MySQL——保证主从一致

binlog 可以用来归档,也可以用来做主备同步,备库执行了 binlog 就可以跟主库保持一致。 MySQL 主备的基本原理 如图 1 所示就是基本的主备切换流程。 在状态 1 中,客户端的读写都直接访问节点 A,而节点 B 是 A 的备库&#xff…

Java安全--CC4

CC4 环境提一小嘴: CC4利用的是commons-collections4,所以我们需要导入新的依赖,地址:https://mvnrepository.com/artifact/org.apache.commons/commons-collections4/4.0 我们先来关注一下利用链: 后半段是一样的&am…

本地运行好好的 Java 程序, 一发布到线上就报错的灵异事件终于让我碰到了

说明 本文涉及的相关软件版本如下: mybatis 3.4.xHotSpot JDK1.8Windows 11IDEA 2022.3 先看一段 mybatis 相关的代码 今天一个朋友丢给我如下一段代码: 然后跟我讲为什么本地是好好的, 发布到线上执行就报错。 BlogMapper.java public…

【python机器学习】K-Means算法详解及给坐标点聚类实战(附源码和数据集 超详细)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 人们在面对大量未知事物时,往往会采取分而治之的策略,即先将事物按照相似性分成多个组,然后按组对事物进行处理。机器学习里的聚类就是用来完成对事物进行分组的任务 一、样本处理 聚类…