JDK | 版本 - [8 -> 21 主要更新内容]

§1 说明

官方提供的各个 jdk 版本新特新的文档,如
  • https://docs.oracle.com/javase/9/whatsnew/toc.htm
  • https://openjdk.org/projects/jdk/11/
阅读难度略大,且信息分散,下述内容在已有总结的基础上进行梳理
 

§2 明细

JKD
NO
性质
SUMMARY
说明
9
1
架构
模块化
 
2
语法
<> 增强
匿名内部类可以使用 <>
3
语法
try-with-resource 增强
可以释放外部声明的等效 final 变量
4
语法
单独 _ 不能作为标识符
 
5
语法
接口中可以有 private 方法
此时接口中允许的成员包括:静态常量 / 抽象方法 / 默认方法(default)/ 静态方法 / 私有方法
6
性能
String 底层存储
char[] -> byte[],jdk 认为大部分数组中只有 latin-1 字符,为提高新能
7
api
stream api 增强
新增 takeWhile / dropWhile / ofNullable / iterate(重载)
8
api
InputStrean api 增强
新增 transferTo,快速转输出流
9
api
只读集合增强
List.of(ele1,ele2,ele3);
10
api
Optional api 增强
ifPresentOrElse / or / stream
11
工具
jshell
类似 bash,里面可以直接使用 java 的 api
10
1
语法
局部变量类型推断(var)
var List = new ArrayList(); var = variable,限制颇多,完全不建议用
2
api
只读集合增强
List.copyOf(otherList);
3
api
Optional api 增强
orElseThrow
11
1
语法
var 增强
lamda 中可以配合注解使用
2
api
String api 增强
isBlank / strip / stripTrailin / stripLeading / repeat / lines().count()
3
api
Optional api 增强
isEmpty
4
api
HttpClient 正式可用
jdk 9 开始引入,11 正式可用
5
工具
java 命令行增强
新语法 java A.java,以前只能 javac A.java -> java A
6
GC
ZGC(预览)
 
7
底层
对 unicode10 的支持
unicode 与 UTF 的关系
12
1
语法
switch 增强(预览)
switch 语句,对 -> 的支持,可以防穿透,因此免 break
2
api
NumberFormat 增强
增加对人类友好短格式的支持,1000 -> 1k
3
api
String 增强
transform(Function) / indent (调整缩进)
4
api
Files 增强
mismatch 对比差异
5
GC
Shenandoah GC(预览)
 
5
GC
G1 增强
Collection set 拆分 mandatory、optional,完成mandatory 后,gc 即为可中断状态
6
GC
G1 增强
按系统负载,决定是否进行定期垃圾回收,如果回收,可以触发 FullGc,并可能释放 java 堆给系统
7
api
ConstantDesc/Constable
大致意思是不直接使用 public static final,而是将其包装为 ConstantDesc,并加入 jvm 常量池
8
测试
JMH
性能测试工具,结合 maven 会在构建时多生成一个独立的 jar 用于方法级性能测试
9
底层
ARM64端口只保留aarch64 实现
arm64 是一种 64 位微处理器架构,和他对等的是x86_64架构,不同架构支持的指令集会有区别
适配 ARM64 的 jdk 有两套:oracle 的 arm64, open 的 aarch64,jdk12 里把前者拆了,只留了后者
10
底层
默认开启 CDS
CDS = Class-Data Sharing,jdk 5 引入,用于一个物理机/虚拟机上启动多个 jvm 时
使这些 jvm 直接可以共享核心类的装载,而不需要每个 jvm 独立加载所有类,但是需要手动配置开启
11
底层
对 unicode11 的支持
 
13
1
语法
switch 增强(预览)
switch 语句,对 yield 的支持,其实就是一种防呆语法,语法逻辑没有变更
2
语法
文本块(预览)
用一对 """ 包裹(必须折行),类似 CDATA 区,可读性较强
3
api
Socket api 重写
NioSocketImpl
4
GC
ZGC 增强
可以将未使用的内存还给操作系统,会调整堆大小
5
底层
默认开启 CDS
允许 JVM 在启动后动态归档类元数据
14
 
1
语法
instanceof 增强(预览)
instanceof-and-cast 语法:obj instanceof AClazz aclz,然后直接使用 aclz 变量,此变量即 AClazz 类型
2
语法
switch 增强(正式)
就是正式确认了之前的增强
3
语法
文本块(预览)
增加了对常见格式的支持,xml、json等
4
语法
record
相当于用 javaBean 的全参构造器代替声明这个javaBean,代价是其对象不能修改
本质是所有字段都 final 的 final 类
5
GC
G1 增强
NUMA(非统一内存访问架构)增强
6
GC
GC 组合弃用
Serial+CMS,ParNew+Serial Old
7
GC
cms 移除
 
8
GC
ZGC 增强
支持 windows 、mac
9
底层
NPE 增强
会在异常信息里明确具体什么东西 null 了
15
1
语法
sealed class(预览)
密封类,限制子类,不允许指定之外的子类,约等于子类的枚举化 -> "莫挨老子代码"
2
语法
hidden class
隐藏类,不能被其他 class 直接只用,只能反射
3
语法
record(预览)
增强部分内部功能,包括默认实现的方法
4
语法
文本块(正式)
 
5
GC
ZGC(正式)
 
6
性能
禁用偏向锁
偏向锁其实就是一种有锁但是无竞争的特殊锁状态,正常情况下应该很短暂,但是有锁膨胀的成本
7
api
Socket api 重写
DatagramSocket
16
1
语法
sealed class(预览)
 
2
语法
instanceof 增强(预览)
 
3
语法
record(预览)
允许内部类作为记录的成员
4
api
Vector api(预览)
向量类
5
GC
ZGC 增强
对线程栈的处理从安全点移动至并发阶段
6
底层
C++ 14 特性支持
在 java 底层使用 C++ 14 的特性
7
底层
弹性元空间
现在 jvm 会将没有用到的元空间返还给操作系统
8
底层
对 jdk 内部元素进行强封装
未通过模块化导出的所有元素都视为内部元素,禁止访问,包括通过反射访问
17
1
语法
sealed class(正式)
 
2
语法
switch 增强(预览)
模式匹配:在同一个 switch 表达式中,支持 Object 入参,相当于支持基于类型的分支判断
3
语法
浮点增强
浮点计算回归严格语义,strictfp 关键字失效。非严格语义的浮动计算省资源,但不同机器运算结果可能不同
4
api
随机类增强
RandomGenerator
5
api
Vector api(预览)
 
6
api
FFM API(预览)
 
外部函数和内存 API ,如 MemorySegment、SymbolLookup 等,在 jdk.incubator.foreign 包中
对应原 JNI 机制,ByteBuffer、Unsafe 类
7
底层
AOT/JIT 移除
提前编译与即时编译工具,实测自诞生以来没啥用,删了 但是同步推出的 GraalVm for JDK 17 一个宣传点就是 AOT/JIT
18
1
语法
javadoc 增强
支持语法高亮
2
语法
switch 增强
模式匹配增强,支持 null
3
api
Vector api(预览)
 
4
api
FFM API(预览)
 
5
api
互联网地址解析SPI
java.net.InetAddress 可以通过 spi 注入外部解析器
6
性能
反射增强
api 不变,但是提升性能
7
工具
jwebserver 命令
jdk 内置精简 web 服务器,不支持 CGI 和 Servlet(所有不知道这有啥用)
8
底层
默认使用 UTF-8 编码
 
19
1
语法
Record Patterns(预览)
instanceof 增强与 record 结合后的语法,形如 obj instanceof Point(int x, int y)
2
语法
switch 增强
模式匹配
3
api
FFM API(预览)
 
4
api
Virtual Thread(预览)
Thread.ofVirtual(),以及虚拟线程池 Executors.newVirtualThreadPerTaskExecutor()
5
api
Vector api(预览)
 
6
api
结构化并发(预览)
StructuredTaskScope,强调任务之间的关联
同时被提交的任务应该随着提交方一起终结,以避免提交方终结后,被提交的任务还在执行且相互关系更晦暗
20
1
语法
Record Patterns(预览)
 
2
语法
switch 增强(预览)
模式匹配
3
api
scoped values(预览)
相当于改进版的 ThreadLocal,可以在不同线程(含虚拟线程)之间复用形参
不同线程之间,形参相互独立,且其值不可变
4
api
FFM API(预览)
 
5
api
Virtual Thread(预览)
 
6
api
结构化并发(预览)
 
7
api
Vector api(预览)
 
21
1
语法
Record Patterns(正式)
 
2
语法
switch 增强(正式)
 
3
语法
匿名模式/值(预览)
当不关心值具体是什么的时候,用 _ 代表一个模式或者值
4
语法
匿名类实例main方法(预览)
 
出于教学目的,个人认为不需要关注。程序入口以前只能是类的静态 main 方法
现在允许非静态 main 方法,并在静态 main 中实例化主类,并调用实例的 main
5
api
FFM API(预览)
 
6
api
Virtual Thread(正式)
 
到此以前的线程被归类为平台线程,与虚拟线程相对
n 多根虚拟线程对应一根平台线程,对应一根内核线程
虚拟线程的原理实在 jvm 内部实现虚拟线程调度,而不是有操作系统完成,因此不需要上下文切换
7
api
scoped values(预览)
 
8
api
字符串模板(预览)
 
String name = "zou"; String say = STR."Hello \{name}";
9
api
有序集合(预览)
Sequenced Collections,有序、高性能、线程安全的集合
10
api
Vector api(预览)
 
11
api
结构化并发(预览)
 
12
api
秘钥封装 api
KeyEncapsulationMechanism
13
GC
分代 ZGC
-XX:+ZGenerational,官网 说(最后一节),开了分代后吞吐量可以达到不开的4倍
但实际提升有人测过只 10%
14
底层
准备禁用动态agent加载(预览)
-Djdk.attach.allowAttachSelf=false
 
 
 
 
 
posted @ 2025-09-03 14:44  问仙长何方蓬莱  阅读(21)  评论(0)    收藏  举报