当前位置:首页 > 科技  > 软件

JDK21 性能提升20倍

来源: 责编: 时间:2023-10-20 10:02:04 178观看
导读大家好,我是了不起。JDK21 发布已经过去1个月时间了,除了每次发版必然更新的GC机制,和一些增强功能外,还引入了一个全新的概念——虚拟线程。什么是虚拟线程先来看一下官方对虚拟线程(Visual Threads)的描述(已翻译):如今,JD

大家好,我是了不起。YMP28资讯网——每日最新资讯28at.com

JDK21 发布已经过去1个月时间了,除了每次发版必然更新的GC机制,和一些增强功能外,还引入了一个全新的概念——虚拟线程。YMP28资讯网——每日最新资讯28at.com

什么是虚拟线程

先来看一下官方对虚拟线程(Visual Threads)的描述(已翻译):YMP28资讯网——每日最新资讯28at.com

如今,JDK中java.lang.Thread的每个实例都是一个平台线程。平台线程在底层操作系统线程上运行Java代码,并在代码的整个生命周期中捕获操作系统线程。平台线程的数量限制为操作系统线程的数量。YMP28资讯网——每日最新资讯28at.com

虚拟线程是java.lang.thread的一个实例,它在底层操作系统线程上运行java代码,但在代码的整个生命周期内不会捕获该操作系统线程。这意味着许多虚拟线程可以在同一个操作系统线程上运行Java代码,从而有效地共享代码。YMP28资讯网——每日最新资讯28at.com

虽然平台线程独占了宝贵的操作系统线程,但虚拟线程却没有。虚拟线程的数量可以比操作系统线程的数量大得多。YMP28资讯网——每日最新资讯28at.com

虚拟线程是JDK而不是OS提供的线程的轻量级实现。它们是用户模式线程的一种形式,在其他多线程语言中也很成功(例如Go中的goroutines和Erlang中的processes)。用户模式线程甚至在早期版本的Java中被称为“绿色线程”,当时操作系统线程还不成熟和广泛使用。然而,Java的绿色线程都共享一个操作系统线程(M:1调度),并且最终被平台线程所超越,后者被实现为操作系统线程的包装器(1:1调度)。虚拟线程采用M:N调度,其中大量(M)虚拟线程被调度在少量(N)OS线程上运行。YMP28资讯网——每日最新资讯28at.com

简而言之,现在我们可以轻松地创建一个轻量级的虚拟线程,实现简单性,同时充分发挥硬件性能。YMP28资讯网——每日最新资讯28at.com

可以概括为: 轻量、多路复用、开销极小、异步编程、可移植性YMP28资讯网——每日最新资讯28at.com

测试

开始一个简单的测试:1万并发阻塞1秒模仿web连接池,使用Thread.sleep(1) 模拟IO操作需要的时间。YMP28资讯网——每日最新资讯28at.com

public static void main(String[] args) throws InterruptedException {    long l = System.currentTimeMillis();//    normal();    virtual();    System.out.println(System.currentTimeMillis() - l);}

先使用常规线程池方式运行:YMP28资讯网——每日最新资讯28at.com

public static void normal() throws InterruptedException {    ExecutorService executor = Executors.newFixedThreadPool(200);    for (int i=0; i < 10000; i++) {        executor.execute(() -> {            try {                System.out.println("normal");                Thread.sleep(1000);            } catch (InterruptedException e) {                e.printStackTrace();            }        });    }    executor.shutdown();    executor.awaitTermination(100, java.util.concurrent.TimeUnit.SECONDS);}

得到如下结果:YMP28资讯网——每日最新资讯28at.com

图片图片YMP28资讯网——每日最新资讯28at.com

使用 JDK21 虚拟线程池运行:YMP28资讯网——每日最新资讯28at.com

public static void virtual() throws InterruptedException {    ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();    for (int i=0; i < 10000; i++) {        executor.execute(() -> {            try {                System.out.println("jdk21");                Thread.sleep(1000);            } catch (InterruptedException e) {                e.printStackTrace();            }        });    }    executor.shutdown();    executor.awaitTermination(100, java.util.concurrent.TimeUnit.SECONDS);}

得到如下结果:YMP28资讯网——每日最新资讯28at.com

图片图片YMP28资讯网——每日最新资讯28at.com

20多倍的提速!!!YMP28资讯网——每日最新资讯28at.com

我不理解,但我大受震撼!!!YMP28资讯网——每日最新资讯28at.com

如果有朋友想自己测试一下虚拟线程,或者JDK21的其他新特性,可以尝试一下哦~YMP28资讯网——每日最新资讯28at.com

JDK21 官网下载链接:https://download.oracle.com/graalvm/21/latest/graalvm-jdk-21_windows-x64_bin.zipYMP28资讯网——每日最新资讯28at.com

目前虚拟线程还属于预览版本,没有正式启用。如果是IDEA 开发工具,在启动的时候,需要配置VM参数 --enable-previewYMP28资讯网——每日最新资讯28at.com

图片图片YMP28资讯网——每日最新资讯28at.com

小结

经过测试,在该例子中,Executors.newFixedThreadPool( size ); size的值越大,普通的线程池用时越短,在线程池的大小开放到 10000后,用时几乎一样。YMP28资讯网——每日最新资讯28at.com

应该是本例的IO操作是Thread.sleep的缘故,所以不会占用CPU资源。YMP28资讯网——每日最新资讯28at.com

传统的线程池,一般我们会指定核心线程数量为 CPU核心数*4,最大线程数为 CPU核心数*8,而在虚拟线程池中,不需要指定线程数,JDK会自动根据资源占用情况,创建合适数量的线程,追求更高的吞吐量。YMP28资讯网——每日最新资讯28at.com

听说springboot3.2.0版本开始,springboot要把webflux底层也改成虚拟线程了,不知道以后会不会把所有的关于异步线程的地方都改成虚拟线程。YMP28资讯网——每日最新资讯28at.com

了不起是觉得这个虚拟线程真是个好东西,简单易用,再也不纠结怎么配置线程池,根据硬件自适应,效率极高。YMP28资讯网——每日最新资讯28at.com

现在Spring6是基于JDK17的,不知道下个大版本更新会不会直接更新到有虚拟线程稳定发布的JDK版本,期待!YMP28资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-14296-0.htmlJDK21 性能提升20倍

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 携程火车票异常检测和根因定位实践

下一篇: 为啥有的ConfigMap要重启Pod才生效

标签:
  • 热门焦点
  • 红魔电竞平板评测:大屏幕硬实力

    红魔电竞平板评测:大屏幕硬实力

    前言:三年的疫情因为要上网课的原因激活了平板市场,如今网课的时代已经过去,大家的生活都恢复到了正轨,这也就意味着,真正考验平板电脑生存的环境来了。也就是面对着这种残酷的
  • CSS单标签实现转转logo

    CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • 只需五步,使用start.spring.io快速入门Spring编程

    只需五步,使用start.spring.io快速入门Spring编程

    步骤1打开https://start.spring.io/,按照屏幕截图中的内容创建项目,添加 Spring Web 依赖项,并单击“生成”按钮下载 .zip 文件,为下一步做准备。请在进入步骤2之前进行解压。图
  • Python异步IO编程的进程/线程通信实现

    Python异步IO编程的进程/线程通信实现

    这篇文章再讲3种方式,同时讲4中进程间通信的方式一、 Python 中线程间通信的实现方式共享变量共享变量是多个线程可以共同访问的变量。在Python中,可以使用threading模块中的L
  • 中国家电海外掘金正当时|出海专题

    中国家电海外掘金正当时|出海专题

    作者|吴南南编辑|胡展嘉运营|陈佳慧出品|零态LT(ID:LingTai_LT)2023年,出海市场战况空前,中国创业者在海外纷纷摩拳擦掌,以期能够把中国的商业模式、创业理念、战略打法输出海外,他们依
  • 花7万退货退款无门:谁在纵容淘宝珠宝商家造假?

    花7万退货退款无门:谁在纵容淘宝珠宝商家造假?

    来源:极点商业作者:杨铭在淘宝购买珠宝玉石后,因为保证金不够赔付,店铺关闭,退货退款难、维权无门的比比皆是。&ldquo;提供相关产品鉴定证书,支持全国复检,可以30天无理由退换货。&
  • 微博大门常打开,迎接海外画师漂洋东渡

    微博大门常打开,迎接海外画师漂洋东渡

    作者:互联网那些事&ldquo;起猛了,我能看得懂日语了&rdquo;。&ldquo;为什么日本人说话我能听懂?&rdquo;&ldquo;中文不像中文,日语不像日语,但是我竟然看懂了&rdquo;&hellip;&hell
  • 携众多高端产品亮相ChinaJoy,小米带来一场科技与人文的视听盛宴

    携众多高端产品亮相ChinaJoy,小米带来一场科技与人文的视听盛宴

    7月28日,全球数字娱乐领域最具知名度与影响力的年度盛会中国国际数码互动娱乐展览会(简称ChinaJoy)在上海新国际博览中心盛大开幕。作为全球领先的科
  • iQOO Neo8系列今日官宣:首发天玑9200+ 全球安卓最强芯!

    iQOO Neo8系列今日官宣:首发天玑9200+ 全球安卓最强芯!

    在昨日举行的的联发科新一代旗舰芯片天玑9200+的发布会上,iQOO官方也正式宣布,全新的iQOO Neo8系列新品将全球首发搭载这款当前性能最强大的移动平台
Top
Baidu
map