千呼万唤始出来 JDK 21 LTS, 久等了
平地起惊雷!!!

你可以称呼它为:JDK 8 之后的神,它也是很多人认为的 JDK 8 之后,最值得升级的版本。
以前大家都说:
他发任他发,我用JAVA 8
抱歉,这次JDK 21 我不得不使用了
已知使用较为广泛的几个 LTS版本是 (Long Term Support) :
- JDK 8 LTS
- JDK 11 LTS
- JDK 17 LTS
那么为什么非得是 JDK 21呢?
英雄的迟暮
- ...
- Kafka 宣布弃用 Java 8 ...
- Jenkins 宣布弃用 Java 8 ...
- Spring6 强依赖 Java 17 ...
- Elasticsearch 使用的JDK 也不是 JDK8
- ......
JDK 8 的地位并非无可撼动的,如下所示为某个机构统计的,近几年一些线上 JAVA 应用使用的 JDK 版本情况:

LTS j8 已经从 84% 一路迭到了 32%
而另两个 LTS 版本 J_11 和 J_17 的使用情况都有了长足的进步
所以别傻了,可能只有你在坚守JDK 8,你的小伙伴可能都已经转投别人温暖的怀抱了
JDK 21 LTS 可是迎来了史诗级的增强(后边详述),它的表现一定不会比 JDK_11 和 JDK_17弱。
spring系列作为绑定JAVA的头号玩家,期待Spring 的下一个大版本。
变革的大幕已经拉开,车轮已经开始滚滚先前; 昨日之日或西垂,夺目新日将大展光芒。
大人时代变了
JDK 21他来真的了,下边是我们的主角闪亮登场:
曾经在JDK 19中作为预览的虚拟线程,在JDK 21 LTS 中成为正式功能了
[PS * JDK 21 除了 虚拟线程 ,其实还有不少别的特性,但是我感觉都属于真正的平平无奇的水平,只有 虚拟线程 值得大动干戈。]
犹记得曾经阅读读 《深入理解Java虚拟机》一书时,关于Java 并发编程模型的章节,了解了 JAVA 的并发编程模型现状后,纯纯的 GoLang 薄纱啊,故此实引为一大遗憾。当时书中提到 JAVA 官方启动了 Loom 项目来弥补这一缺憾,当时都只觉得是在忽悠,这么多年的问题了,哪儿能那么容易解决呢,怕是画了老大一个饼吧? 虽然是耿耿于怀,之后老长时间没有关注它了,然后,突然某天看到JDK 21来了, 虚拟线程 成为了正式功能了,当时看到这个消息时还是挺开心的
问题一: 不就是上下文切换么,我配置好线程池不就够了?
- 设置线程池在一定程度上,确实可以减少上下文切换,但是除了创建线程、线程销毁,线程的生命周期中的其它操作呢?
问题二,屎山怎么办?
- 屎山没必要动它,原样维持呗,可别给我说你本地装了 j21 之后j8 的项目就跑不起来了。
- 而且现在【微服务 + 容器平台】那么火爆,这同样也是解决之道啊
JDK 21 LTS 前 JAVA并发编程模型
JAVA 21之前的版本,用户态(JVM 态)下,JDK的并发编程模型的是,JVM线程与操作系统的内核线程 1:1 实现,缺点是在用户态(JVM态)下的每一个线程的,挂起、唤醒、销毁等调度操作,都会直接作用到操作系统的内核线程上。

- LWP (Light Weight Process) 轻量级进程, 也就是JDK 21 之前版本中 JAVA 线程了
- KLT (kernel Level Thread) 操作线程内核线程
LWP 与 KLT 之间是一对一的
从JVM 发起对内核线程的调度,相对来说是一个非常重的操作,资源消耗严重。
关于资源消耗,例如:
- LWP (轻量级进程) 会消耗一定的内核资源,比如内核线程的栈空间,因此操作系统支持的轻量级进程是有限的。
- 高损耗的内核线程调度,它直接影响高并发场景下,多个线程的执行效率,所以之前偶尔听到流传的一个说法: Java业务为王,GoLang高并发称雄。
JDK 21 LTS 中的 JAVA 并发编程模型
而到了JDK 21 LTS 中引入的 虚拟线程 呢,到了这里并发编程模型的实现发生了变化:
JVM 态线程跟操作系统内核态线程不再 {1:1} 实现,而是 { [1 (操作系统内核线程)] : [N (JVM 虚拟线程 )] }。这样在JVM态下,对每个 虚拟线程 的创建、调度、切换、销毁等操作,不再直接高度依赖操作系统内核线程,所以高并发常见下,线程的执行效率会有很大提升。

- UT: user thread 用户线程,也可以称呼它:虚拟线程
其实 GoLang 的协程就是类似 虚拟线程 的东西;不过 JAVA 的 虚拟线程 跟 GoLang 的协程还是有区别的:
- GoLang 的协程支持跨核(cpu),内存管理更优
- Java 的虚拟线程不支持跨核,但是执行的效率更佳
具体要怎么选择,就是仁者见仁智者见智了。
回到前边提到的关于线程池的问题上来
虚拟线程 VS 线程池
先明确两个概念:
- 轻量级进程:也就是 JDK 21 之前的 JAVA 线程,它的上下文切换直接关联到操作系统内核上。
- 虚拟线程:JDK 21 新特性,纯JVM 用户态下的东西,它的执行、调度... 等操作不会强关联系统内核
线程池大行其道的原因:
每个 轻量级进程 的创建,都会直接去操作,操作系统的内核线程,并竞争CPU 的时间分片。所以聪明的大佬们想到了一个办法就是引入线程池,这样就可以大量节省去调度操作系统内核线程,执行 轻量级进程 创建、线程注销相关的操作开销了。
JDK 21 之前 轻量级进程 自身占用的内存很高,也是线程池能够大行其道的原因之一,常见的64位的操作系统上一个 轻量级进程 默认占用 1MB 的内存空间,算算你的机器能创建多少个 轻量级进程 吧。
但是即使有了线程池,还是指标不治本。 轻量级进程 除了创建、销毁之外,还有:挂起、唤醒 ...... 等等一系列的操作的上下文切换还是要依赖操作系统内核来完成的。由于线程池是复用的,线程池的每个 轻量级进程 会经历无数次的挂起、唤醒、执行CPU 时间分片, 直至 轻量级进程 被线程池踢除。
然后就是 虚拟线程 了,它彻底解决了这些难点问题:
- 基于用户态实现的并发编程模型,决定了 虚拟线程 调度,不再强依赖系统内核
- 虚拟线程 空间占用极小,默认只有几百字节,在64位的系统上,比 轻量级进程 默认的 1MB 小了太多太多;同等内存占用下,创建的 虚拟线程 数绝对很容易达到 轻量级进程 数的指数倍。
The Last
总结来说就是:
减少了直接对操作系统内核线程的调度,将并发模型从操作系统内核 {1:1} 实现,转变为 {1:N} 实现,虚拟线程将完全由 JVM 自管理,执行效率,资源利用率都将得到提升。
综上所述直接吹爆 JDK 21,因为从 虚拟线程 开始,Java 在高并发领域也获得了入场券。越是了解JVM 并发编程的模型的人,越会知道 虚拟线程 的重量。
连挤牙膏式的 JDK 11 LTS 和 JDK 17 LTS 使用量都能上去,凭什么作为王牌的 JDK 21 LTS 会上不去?
千呼万唤始出来 JDK 21 LTS, 久等了的更多相关文章
- OpenJDK,Oracle's OpenJDK,Oracle JDK的区别与选择
OpenJDK 单纯的OpenJDK指的是JDK的源码,以GPL协议开源,由企业和社区开发者共同维护和开发. Oracle's OpenJDK Oracle started providing ope ...
- 关于windows的jdk
扯淡工作从web开发转向build automation,不知不觉已经一个半月了,各种学习熟悉build相关的流程和知识,比如ant, maven, jenkins 等CI技能.因为这一个半月学的东西 ...
- Java 8 + 10 = Java 18
明天Java 18将正式发布, 虽然它不是长期支持 (LTS) 版本,但它却实现了九个 JEP(在Java 18列出).有哪些特性值得关注呢?今天胖哥为你提前解读.再看.点赞.转发.关注来一波吧. J ...
- Java学习-第一阶段-第一节:Java概述
JAVA概述 Java版本 原网址(https://www.oracle.com/java/technologies/java-se-support-roadmap.html) Oracle 将仅将某 ...
- 从零开始学Java系列之Java是什么?它到底是个啥?
全文大约[5000]字,不说废话,只讲可以让你学到技术.明白原理的纯干货!文章带有丰富案例及配图,只为让你更好的理解和运用文中的技术概念,给你带来具有足够的思想启迪...... ----------- ...
- Eclipse Python配置
Macbook上面安装pydev后,发现新建project后并没有PyDev的选项.在官网上搜索后发现是JDK版本太久.上Oracle官网下载了最新JDK(url: http://www.oracle ...
- spring reference
Spring框架概述 Spring可以轻松创建Java企业应用程序.它提供了在企业环境中使用Java语言所需的一切,支持Groovy和Kotlin作为JVM上的替代语言,并可根据应用程序的需要灵活地创 ...
- IntelliJ IDEA 常用设置
1.idea每次打开项目的设置 2.设置编译器的快捷键 File->Keymap 在列表里面选择快捷键的名称 如果想使用跟Eclipse一样的快捷键,选中Eclipse copy即可 3.滚 ...
- 专利事务所信息Python爬取
数据来源:http://www.acpaa.cn/ 目前事务所的信息没有做反爬限制,还是很容易拿到数据的 没有用html解析工具,直接上正则,结果就是需要处理很多乱七八糟的空格...为了能将日期顺利的 ...
- 聊聊 Java8 以后各个版本的新特性
作者:ZY5A59 juejin.im/post/5d5950806fb9a06b0a277412 某天在网上闲逛,突然看到有篇介绍 Java 11 新特性的文章,顿时心里一惊,毕竟我对于 Java ...
随机推荐
- SpringBoot+MyBatisPlus实现读写分离
前言 随着业务量的不断增长,数据库的读写压力也越来越大.为了解决这个问题,我们可以采用读写分离的方案来分担数据库的读写负载.本文将介绍如何使用 Spring Boot + MyBatis Plus + ...
- Python编程和数据科学中的机器学习:如何处理和可视化具有噪声和干扰的数据
目录 随着数据科学和机器学习的快速发展,处理和分析具有噪声和干扰的数据成为了一个日益重要的挑战.在数据科学和机器学习中,噪声和干扰通常来自于各种因素,例如随机性和非随机性,数据缺失,数据集中的错误或错 ...
- 精选8道ES高频面试题和答案,后悔没早点看。
不要再干巴巴的背诵八股文了,一定要结合具体场景回答面试问题! 前言 我们在回答面试题的时候,不能干巴巴的去背八股文,一定要结合应用场景,最好能结合过去做过的项目,去和面试官沟通. 这些场景题虽然不要求 ...
- 使用libavcodec将mp3音频文件解码为pcm音频采样数据【[mp3float @ 0x561c1ec49940] Header missing】
一.打开和关闭输入文件和输出文件 想要解决上面提到的问题,我们需要对mp3文件的格式有个大致了解,为了方便讲解,我这里画了个示意图: ID3V2 包含了作者,作曲,专辑等信息,长度不固定,扩展了 ID ...
- influxdb常用sql总结
本文为博主原创,转载请注明出处: 1.登录influxdb influx -username admin -password "password" 2.查看数据库 ##查看有哪些数 ...
- 从数据库中读取数据并写入到Excle电子表格之1
//获取数据 using (SqlDataReader reader = Alian_SQL_Helper.SQL_Helper .ExecuteReader( "select CC_Aut ...
- 根据模板动态生成word(一)使用freemarker生成word
@ 目录 一.准备模板 1.创建模板文件 2.处理模板 2.1 处理普通文本 2.2 处理表格 2.3 处理图片 二.项目代码 1.引入依赖 2.生成代码 三.验证生成word 一.准备模板 1.创建 ...
- 【转载】Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化
原文链接: 作者:LoyenWang 出处:https://www.cnblogs.com/LoyenWang/ 公众号:LoyenWang 版权:本文版权归作者和博客园共有 转载:欢迎转载,但未经作 ...
- C# 12新预览功能介绍
Visual Studio 17.7 Preview 3和.NET 8 Preview 6延续了C# 12的发展.该预览版包含的功能旨在为未来的性能增强奠定基础.对内联数组的轻松访问将允许库在更多地方 ...
- 如何编写难以维护的React代码?——滥用useEffect
如何编写难以维护的React代码?--滥用useEffect 在许多项目中,我们经常会遇到一些难以维护的React代码.其中一种常见的情况是滥用useEffect钩子,特别是在处理衍生状态时.让我们来 ...