JDK各版本的特性
JDK8新特性(2014-3长期版本)
1、Lambda表达式;
2、函数式编程;
3、接口可以添加默认方法和静态方法,也就是定义不需要实现类实现的方法;
4、方法引用;
5、重复注解;
6、引入Optional来避免空指针;
7、引入Streams相关的流式API;
8、引入新的日期与时间的相关API;
9、新增jdeps命令行,来分析类、目录、jar包的类依赖层级关系;
10、JVM使用元空间(MetaSpace)代替了永久代(PermGen Space)。
11、ConcurrentHashMap、HashMap底层结构变更
重要特性:Lambda表达式、函数式接口、方法引用、Stream流式API、采用元空间(MetaSpace)代替了方法区(PermGen Space)。
JDK9新特性(2017-9)
1、接口方法可以使用private来修饰
2、设置G1为JVM默认垃圾收集器
3、支持http2.0和websocket的API
4、优化String的存储方式,由char数组变更为byte数组。
重要特性:主要是API的优化,如支持HTTP2的Client API、JVM采用G1为默认垃圾收集器
JDK10新特性(2018-3)
1、局部变量类型推断,类似JS可以通过var来修饰局部变量,编译之后会推断出值的真实类型;
2、并行Full GC,来优化G1的延迟;
3、允许在不执行全局VM安全点的情况下执行线程回调,可以停止单个线程,而不需要停止所有线程或不停止线程。
重要特性:通过var关键字实现局部变量类型推断,使Java语言变成弱类型语言、JVM的G1垃圾回收由单线程改成多线程并行处理,降低G1的停顿时间
4、Optional类新增orElseThrow方法
5、新增几个关于集合的API,有助于创建不可变的集合
6、增强型for循环的字节码生成
JDK11新特性(2018-9长期版本)
1、ZGC,ZGC可以看做是G1之上更细粒度的内存管理策略。由于内存的不断分配回收会产生大量的内存碎片空间,因此需要整理策略防止内存空间碎片化,在整理期间需要将对于内存引用的线程逻辑暂停,这个过程被称为"Stop the world"。只有当整理完成后,线程逻辑才可以继续运行。(并行回收);
2、Flight Recorder(飞行记录器),基于OS、JVM和JDK的事件产生的数据收集框架;
3、对Stream、Optional、Collection API进行增强。
4、支持Unicode 10
重要特性:对于JDK9和JDK10的完善,主要是对于Stream、集合等API的增强、新增ZGC垃圾收集器。
JDK12新特性(2019-3)
1、Shenandoah GC,新增的GC算法;
2、switch (预览版)表达式语法扩展,可以有返回值;
3、G1收集器的优化,将GC的垃圾分为强制部分和可选部分,强制部分会被回收,可选部分可能不会被回收,提高GC的效率。
4、FileInputStream 和 FileOutputStream的finalize 方法移除
重要特性:switch表达式语法扩展、G1收集器优化、新增Shenandoah GC垃圾回收算法。
JDK13新特性(2019-9)
1、Socket的底层实现优化,引入了NIO;
2、switch表达式增加yield关键字用于返回结果,作用类似于return,如果没有返回结果则使用break;
3、ZGC优化,将标记长时间空闲的堆内存空间返还给操作系统,保证堆大小不会小于配置的最小堆内存大小,如果堆最大和最小内存大小设置一样,则不会释放内存还给操作系统,且支持的堆大小从4TB增至16TB;
4、引入了文本块,可以使用"""三个双引号表示文本块,文本块内部就不需要使用换行的转义字符。
5、FileSystems的API增强
重要特性:ZGC优化,释放内存还给操作系统、socket底层实现引入NIO。
JDK14新特性(2020-3)
1、instanceof类型匹配语法简化,可以直接给对象赋值,如if(obj instanceof String str),如果obj是字符串类型则直接赋值给了str变量;
2、引入record类,类似于枚举类型,可以向Lombok一样自动生成构造器、equals、getter等方法;
3、NullPointerException打印优化,打印具体哪个方法抛的空指针异常,避免同一行代码多个函数调用时无法判断具体是哪个函数抛异常的困扰,方便异常排查;
JDK15新特性(2020-9)
1、隐藏类 hidden class;
2、密封类 sealed class,通过sealed关键字修饰抽象类限定只允许指定的子类才可以实现或继承抽象类,避免抽象类被滥用。
3、CharSequence类增强
JDK16新特性(2021-3)
1、ZGC性能优化;
2、instanceof模式匹配;
3、record的引入。
JDK16相当于是将JDK14、JDK15的一些特性进行了正式引入
JDK17新特性(2021-9长期版本)
1、正式引入密封类sealed class,限制抽象类的实现;
2、统一日志异步刷新,先将日志写入缓存,然后再异步刷新。
虽然JDK17也是一个LTS版本,但是并没有像JDK8和JDK11一样引入比较突出的特性,主要是对前几个版本的整合和完善。
JDK18新特性(2022-3)
1、指定 UTF-8 作为标准 Java API 的默认字符集。通过此更改,依赖于默认字符集的 API
将在所有实现、操作系统、区域设置和配置中保持一致。
2、引入一个简单的 Web 服务器。提供一个命令行工具,来启动一个只提供静态文件的最小网络服务器,它没有 CGI 或类似 servlet
的功能可用。该工具用于原型设计、临时编码和测试目的,尤其是在教学环境中。
3、支持在 Java API 文档中加入代码片段。为 JavaDoc 的 Standard Doclet 引入一个 @snippet
标记,以简化 API 文档中嵌入示例源代码的难度。
4、用方法句柄重新实现核心反射。在 java.lang.invoke 的方法句柄之上,重构 java.lang.reflect
的方法、构造函数和字段,使用方法句柄处理反射的底层机制将减少 java.lang.reflect 和 java.lang.invoke
两者的 API 维护和开发成本;
5、Vector API(第三孵化器)。引入一个 API 来表达向量计算,这些计算在运行时可以编译为支持的 CPU
架构上的最佳向量指令,从而实现优于等效标量计算的性能。
6、互联网地址解析 SPI。定义用于主机名和地址解析的服务提供者接口
(SPI),以便java.net.InetAddress可以使用平台内置解析器以外的解析器。
7、外部函数和内存 API(第二孵化器)。引入了一个新 API, Java 程序可以通过它与 Java
运行时之外的代码和数据进行互操作。通过有效地调用外部函数(即 JVM 外的代码),并安全地访问外部内存(即不由 JVM
管理的内存),外部函数和内存 API 使 Java 程序能够调用本机库并处理本机数据,而不具有 JNI 的脆弱性和危险。
8、switch 模式匹配表达式。使用 switch 表达式和语句的模式匹配以及对模式语言的扩展来增强 Java 编程语言。将模式匹配扩展到
switch 允许针对多个模式测试表达式,每个模式都有特定的操作,可以简洁安全地表达复杂的面向数据的查询。
9、弃用 Finalization 功能。Java 1.0 中引入的 Finalization
旨在帮助避免资源泄漏问题,然而这个功能存在延迟不可预测、行为不受约束,以及线程无法指定等缺陷,导致其安全性、性能、可靠性和可维护性方面都存在问题,因此将其弃用,用户可选择迁移到其他资源管理技术,例如try-with-resources
语句和清洁器。
JDK19新特性(2022-9)
1、记录模式(预览版):支持用户嵌套记录模式和类型模式,以创建强大、声明性且可组合的数据导航和处理形式,从而扩展模式匹配,实现更复杂的数据查询。
2、Switch 模式匹配(第三预览版):根据某些模式来测试表达式,以进行 switch 表达式和语句的模式匹配,让用户可以安全、简洁地表达面向数据的复杂查询。
3、外部函数和内存 API(预览版):Java 程序可以更容易地与 Java 运行时之外的代码和数据进行互操作。通过有效调用外部函数(即 JVM 之外的代码),以及安全地访问外部内存(即不受 Java Virtual Machine [JVM] 管理的内存),API 可以通过纯 Java 开发模型调用本地库和处理原生数据,从而提高易用性、性能、灵活性和安全性。
4、矢量 API(四次孵化阶段):允许以一种在运行时,可靠地编译为支持的 CPU 架构上的向量指令方式表达向量计算,从而实现优于等效标量计算的性能。
5、 Linux/RISC-V 端口:通过将此端口集成到 JDK 主线存储库中中,以便于进行 Linux/RISC-V 实施。
6、虚拟线程(预览版):通过向 Java 平台引入轻量级虚拟线程,显著减少编写、维护和观察高吞吐量并发应用的工作量。开发人员可以通过虚拟线程轻松使用现有的 JDK 工具和技术对并发应用进行故障排除、调试和分析。
7、结构化并发(孵化器):通过简化多线程编程和将运行于不同线程中的多个任务视为一个工作单元,简化错误处理和取消工作并提高可靠性和可观测性。
JDK20新特性(2023-3)
1、新特性
1.1、(D)TLS Key Exchange Named Groups (JDK-8281236)
1.2、Print Warning to Standard Error If Bad java.io.tmpdir Setting Is Detected
如果检测到错误的 java.io.tmpdir 设置,则打印警告为标准错误。
1.3、Add GarbageCollectorMXBean for Remark and Cleanup Pause Time in G1 (JDK-8297247)
在 G1 中添加垃圾收集器MXBean 用于备注和清理暂停时间。该收集器主要将报告备注和清理垃圾回收暂停的发生次数和持续时间。垃圾收集器MXBean与 中的 “CGC” 字段类似,一个完整的并发标记周期将使 Bean 的收集计数器增加 2,一个用于备注,一个用于清理暂停。这些暂停现在也会更新“G1 Old Gen”内存池.jstat -gcutilMemoryManagerMXBean。
1.4、添加了2个JFR Event(初始安全属性、安全提供程序服务)
1.5、加入jmod --compress命令行选项
1.6、将时区数据更新到 2022c
1.7、JavaDoc 标题中自动生成的 ID
4、移除的特性
4.1 Thread
线程的suspend/resume/stop方法已更为抛出异常”UnsupportedOperationException “。
4.2 G1垃圾收集器
G1 并发精简线程的控制已被完全取代。新控制器通常分配较少的线程。它往往在细化线程活动中具有较少的峰值。它还倾向于延迟细化,当对相同或附近的位置进行多次写入时,允许写入屏障进行更多过滤,从而提高屏障的效率。
-XX:G1ConcRefinementYellowZone=
-XX:G1ConcRefinementRedZone=
-XX:G1ConcRefinementThresholdStep=
-XX:G1ConcRefinementServiceIntervalMillis=
这些选项将在将来的某个版本中完全删除。在此之后使用这些选项中的任何一个都将终止虚拟机的启动。
5、未来计划移除
5.1 java.net.URL
URL 的相关构造函数在JDK的未来将会移除,当前版本已标记弃用。
后续完善中。。。。。