java部分
从9开始jdk的更新频率改为半年一更新,其中部分版本非长期支持版本,如jdk12非长期支持版本,当jdk13出了之后就不会在对jdk12进行支持,所以很多厂商如spring等对非长期支持的jdk版本并未表示要强力支持,实际使用也建议使用长期支持的版本
java不同版本新特性总览-(很多感知不强)
版本 | 帖子 | openjdk官网 | 发布时间 |
java8 | https://my.oschina.net/mdxlcj/blog/1622718 | https://openjdk.java.net/projects/jdk8/ | 2014-03-18 |
java9 | https://my.oschina.net/mdxlcj/blog/1622984 | http://openjdk.java.net/projects/jdk9/ | 2017-09-21 |
java10 | https://my.oschina.net/mdxlcj/blog/3009128 | http://openjdk.java.net/projects/jdk10/ | 2018-03-20 |
java11-长期支持 | https://my.oschina.net/mdxlcj/blog/3010342 | http://openjdk.java.net/projects/jdk/11/ | 2018-09-25 |
java12 | https://my.oschina.net/mdxlcj/blog/3102739 | https://openjdk.java.net/projects/jdk/12/ | 2019-03-19 |
java13 | https://my.oschina.net/mdxlcj/blog/3107021 | https://openjdk.java.net/projects/jdk/13/ | 2019-09-17 |
java14 | https://my.oschina.net/mdxlcj/blog/3197478 | https://openjdk.java.net/projects/jdk/14/ | 2020-03-17 |
java15 | https://my.oschina.net/mdxlcj/blog/4586284 | https://openjdk.java.net/projects/jdk/15/ | 2020-09-15 |
java16 | https://my.oschina.net/mdxlcj/blog/5055983 | https://openjdk.java.net/projects/jdk/16/ | 2021-03-17 |
java17-长期支持 | https://my.oschina.net/mdxlcj/blog/5261402 | https://openjdk.java.net/projects/jdk/17/ | 2021-09-14 |
java8
概述 | 说明 | 备注 |
Lambda 表达式 | 匿名函数(内部实现类的简写) | |
函数式接口 | 只包含一个抽象方法的接口,称为函数式接口 | 内置4大核心函数接口
boolean 值。包含方法 boolean test(T t); |
方法引用与构造器引用 | 对象::实例方法 类::静态方法 类::实例方法 ClassName::new | |
Stream API | 是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列 | |
接口中的默认方法与静态方法 | ||
新时间日期API | LocalDate、LocalTime、LocalDateTime | |
其他 |
|
java9
概述 | 说明 | 备注 |
模块化系统 | 模块独立、化繁为简 | 另一种解决方案maven或gradle |
jShell 命令 | 即写即得、快速运行和shell | |
多版本兼容 jar 包 | 对应不同的class文件使用不同的java版本,适用于老项目升级了jdk但新jdk语法不支持的 | |
接口的私有方法 | 不对接口外暴露方法 | |
语法改进:try 语句 | 用资源语句编写 try 将更容易,我们可以在 try 子句中使用已经初始化过的资源,此时的资源是 final 的 | |
下划线使用限制 | 在 java 9 中规定“_”不再可以单独命名标识符了,如果使用, 会报错 | |
String 存储结构变更 | 由jdk8之前的 private final char value[]; 改成了 private final byte[] value; 目的 每个字符使用两个字节(十六位)但最重要的是字符串对象仅包含拉丁字符1。这样的字符只需要 一个字节的存储空间,因此占内部字符数组空间的一半这样的字符串对象中的一个将不再使用 | http://openjdk.java.net/jeps/254 |
便利的集合特性:of() | List.of();Set.of(); | |
增强的 Stream API | dropWhile, 返回剩余的元素
takeWhile, 返回从开头开始的尽量多的元素
ofNullable,方法允许我们创建一个单元素 Stream,可以包含一个非空元素,也可 以创建一个空 Stream
| |
多分辨率图像 API | 图像处理相关,awt相关包下,平常用不到, | |
全新的 HTTP 客户端 API | java自身的http工具类, | 性能表现https://www.cnblogs.com/victor2302/p/11077208.html |
Deprecated 的相关 API | Applet API | |
智能 Java 编译工具 | 智能 java 编译工具( sjavac )的第一个阶段始于 JEP139 这个项目, 用于在多核处理器情况下提升 JDK 的编译速度。如今,这个项目已经 进入第二阶段,即 JEP199,其目的是改进 Java 编译工具,并取代目 前 JDK 编译工具 javac,继而成为 Java 环境默认的通用的智能编译工 具 | |
统一的 JVM 日志系统 | 日志是解决问题的唯一有效途径:曾经很难知道导致 JVM 性能 问题和导致 JVM 崩溃的根本原因。不同的 JVM 日志的碎片化和日志 选项(例如:JVM 组件对于日志使用的是不同的机制和规则),这使 得 JVM 难以进行调试。 解决该问题最佳方法:对所有的 JVM 组件引入一个单一的系统, 这些 JVM 组件支持细粒度的和易配置的 JVM 日志。 | |
javadoc 的 HTML 5 支持 | javadoc 的输出,现在符合兼容 HTML 5 标准 | |
Javascript 引擎升级:Nashorn | Javascript 引擎 | |
java 的动态编译器 | 加快启动快速度,减少内存开销 | 尚未成熟 |
java10
概述 | 说明 | 备注 |
var局部变量 | 注意事项
| |
copyOf方法 | java.util.List、java.util.Set、java.util.Map新增加了一个静态方法copyOf | 深克隆,克隆出来的新集合不可变 |
ByteArrayOutputStream重载toString |
| |
PrintStream、PrintWriter | Java.io.PrintStream,Java.io.PrintWriter,这两个类都有三个新的构造方法,他们需要而外的参数charset
| |
Reader:transferTo |
| |
Formatter、Scanner | java.util.Formatter、java.util.Scanner新增三个构造方法,除了其他参数之外,都需要一个charset参数
| |
java11-长期支持版本
概述 | 说明 | 备注 |
String字符串api加强 |
| |
增强局部变量类型推断var |
| |
移除api | 1、移除了com.sun.awt.AWTUtilities 2、移除了sun.misc.Unsafe.defineClass,使用java.lang.invoke.MethodHandles.Lookup.defineClass来替代 3、移除了Thread.destroy()以及 Thread.stop(Throwable)方法 4、移除了sun.nio.ch.disableSystemWideOverlappingFileLockCheck、sun.locale.formatasdefault属性 5、移除了jdk.snmp模块 6、移除了javafx,openjdk估计是从java10版本就移除了,oracle jdk10还尚未移除javafx,而java11版本则oracle的jdk版本也移除了javafx 7、移除了Java Mission Control,从JDK中移除之后,需要自己单独下载 8、移除了这些Root Certificates :Baltimore Cybertrust Code Signing CA,SECOM ,AOL and Swisscom | |
废弃项 | 1、-XX+AggressiveOpts选项 2、-XX:+UnlockCommercialFeatures 3、-XX:+LogCommercialFeatures选项也不再需要 | |
HttpClient加强方法 |
| |
Unicode 10 | Unicode 10 增加了8518个字符, 总计达到了136690个字符. 并且增加了4个脚本.同时还有56个新的emoji表情符号。 | |
删除模块 | 1、java.xml.ws, 2、java.xml.bind, 3、java.xml.ws, 4、java.xml.ws.annotation, 5、jdk.xml.bind, 6、jdk.xml.ws被移除,只剩下java.xml,java.xml.crypto,jdk.xml.dom这几个模块 7、java.corba, 8、java.se.ee, 9、java.activation, 10、java.transaction被移除,但是java11新增一个java.transaction.xa模块 | |
废除Nashorn javascript引擎 | 在后续版本准备移除掉,有需要的可以考虑使用GraalVM | |
Pack200 Tools and API移除 | 一个压缩工具 | |
新的Epsilon垃圾收集器 | 主要用途 性能测试(它可以帮助过滤掉GC引起的性能假象) 内存压力测试(例如,知道测试用例 应该分配不超过1GB的内存, 我们可以使用-Xmx1g –XX:+UseEpsilonGC, 如果程序有问题, 则程序会崩溃) 非常短的JOB任务(对象这种任务, 接受GC清理堆那都是浪费空间) VM接口测试 Last-drop 延迟&吞吐改进 | |
ZGC |
| 不建议用于生成环境,测试阶段 原理帖子https://www.jianshu.com/p/4e4fd0dd5d25 |
完全支持Linux容器(包括Docker) | 许多运行在Java虚拟机中的应用程序(包括Apache Spark和Kafka等数据服务以及传统的企业应用程序)都可以在Docker容器中运行。但是在Docker容器中运行Java应用程序一直存在一个问题,那就是在容器中运行JVM程序在设置内存大小和CPU使用率后,会导致应用程序的性能下降。这是因为Java应用程序没有意识到它正在容器中运行。随着Java 10的发布,这个问题总算得以解决,JVM现在可以识别由容器控制组(cgroups)设置的约束。可以在容器中使用内存和CPU约束来直接管理Java应用程序 | |
支持G1上的并行完全垃圾收集 | 对于 G1 GC,相比于 JDK 8,升级到 JDK 11 即可免费享受到:并行的 Full GC,快速的 CardTable 扫描,自适应的堆占用比例调整(IHOP),在并发标记阶段的类型卸载等等。这些都是针对 G1 的不断增强,其中串行 Full GC 等甚至是曾经被广泛诟病的短板,你会发现 GC 配置和调优在 JDK11 中越来越方便 | |
Low-Overhead Heap Profiling | 过JVMTI的SampledObjectAlloc回调提供了一个开销低的heap分析方式 | |
ChaCha20和Poly1305两种加密算法, 代替RC4 | ||
新的默认根权限证书集 | ||
最新的HTTPS安全协议TLS 1.3 | ||
Java Flight Recorder | 飞机上的黑盒子,分析工具 | 帖子https://blog.csdn.net/qq_42105629/article/details/104944431 |
java12
概述 | 说明 | 备注 |
switch加强 | jdk14转正 | |
Shenandoah GC | 低停顿时间的GC(预览) Shenandoah GC 主要目标是 99.9% 的暂停小于 10ms,暂停与堆大小无关等 这是一个实验性功能,不包含在默认(Oracle)的OpenJDK版本中。 | |
Microbenchmark Suite | 在JDK源代码中添加一套基本的微基准测试,使开发人员可以轻松运行现有的微基准测试并创建新的基准测试。 | |
JVM常量API | 引入API来模拟关键类文件和运行时工件的名义描述,特别是可从常量池加载的常量 | |
AArch64端口 | arm64在保留32位ARM端口和64位aarch64端口的同时,删除与端口相关的所有源 | |
CDS档案 | 在64位平台上使用默认类列表增强JDK构建过程以生成类数据共享(CDS)归档 | |
增强G1 | 增强G1垃圾收集器,以便在空闲时自动将Java堆内存返回给操作系统 | |
Unicode11 | 更多字符 | |
java.text支持压缩数字格式 |
| |
String增强 | Function<T, R>类型的函数
缩进字符
| |
File增强 | 返回两个文件不匹配的第一个未知
| |
移除项 |
| |
废弃项 |
|
java13
概述 | 说明 | 备注 |
switch增强 | 预览版,jdk14转正 | |
文本框 | jdk15转正 | |
动态CDS档案 | 可以让不同 Java 进程之间共享一份类元数据,减少内存占用,它还能加快应用的启动速 度。 | |
增强ZGC | 增强ZGC以将未使用的堆内存返回给操作系统。 | |
重新实现旧版套接字API | 重新实现了古老的 Socket 接口, java.net.Socket 和 java.net.ServerSocket | |
增加项 |
| |
移除项 |
| |
废弃项 |
| |
已知问题 | 不再支持Windows 2019 Core Server 使用ZIP File System (zipfs) Provider来更新包含Uncompressed Entries的ZIP或JAR可能造成文件损坏 |
java14
概述 | 说明 | 备注 |
instanceof的模式匹配 | jdk16转正 | 预览 |
switch增强 |
| |
弃用ParallelScavenge和SerialOld GC | 孵化器模块 | |
删除CMS垃圾回收器 | CMS在JDK9中就被标记为Deprecate了 | |
打包工具 |
| 孵化器模块 |
G1的NUMA-Aware的内存分配 | ||
JFR事件流 | ||
非易失性映射字节缓冲区 | ||
外部内存访问AP | ||
弃用Solaris和SPARC的移植 | ||
删除Pack200工具和API |
java15
概述 | 说明 | 备注 |
CharSequence中添加了isEmpty默认方法 | 定义isEmpty用于测试字符序列是否为空的默认方法,CharSequence::isEmpty可以用作方法参考。实现的类java.lang.CharSequence和定义isEmpty方法的另一个接口应注意这一点,因为可能需要对其进行修改以覆盖isEmpty方法 | |
支持Unicode 13.0 | 增加字符支持 | |
TreeMap新方法 | TreeMap重新实现压倒性一切的如:putIfAbsent、computeIfAbsent、computeIfPresent、compute、merage | |
文本块 |
| |
隐藏类 | 基于JVM构建的许多语言实现都依靠动态类生成来提高灵活性和效率 | |
GC回收期 | 淘汰-XXUseAdaptiveGDBoundary | |
改进的序列化处理,IO | 使用java.io.ObjectInputStream.setObjectInputFilter方法设置序列化过滤器时,必 须在从流中读取任何对象之前调用它。如果调用readObject或方法readUnshared,则该setObjectInputFilter方法将引发IllegalStateException。 | |
支持货币分组分隔符 | DecimalFormat / DecimalFormatSymbols类现在可以处理货币值的分组分隔符。例如,在奥地利(de-AT语言环境)中使用的德语语言的货币分组分隔符为“。”,而在其他德语语言环境中的货币分组分隔符为“。”。 | |
time用默认值覆盖本地化值 | ava.time.format.DateTimeFormatter.localizedBy(Locale)方法现在采用默认 的语言环境值,例如Chronology和/或DecimalStyle指定的语言环境参数。 | |
time ValueRange.of | ValueRange.of(long min,long maxSmallest,long maxLargest),如果 最小值大于最小最大值,则将引发异常。但是,仅当最小值大于最大最大值时才会发生例外。 | |
性能改进InflaterOutputStream.write | 1、InflaterOutputStream(OutputStream out, Inflater infl, int bufLen)允 许指定要使用的解压缩器和缓冲区大小。 2、InflaterOutputStream.write(byte[] b, int off, int len) 正在使用最大512字节的缓冲区大小写入数据。 3、从JDK 15开始,通过InflaterOutputStream(OutputStream out, Inflater infl,int bufLen)所指定的缓冲区大小将在对的调用中使用InflaterOutputStream.write( byte[] b,int off, int len)。如果在调用InflaterOutputStream 构造函数时未指定缓冲 区大小,则默认为512字节。 | |
集合性能提升(Better Listing of Arrays) | 复制集合的首选方法是使用“复制构造函数”。例如,要将集合复制到新的ArrayList中,可以编写new ArrayList<>(collection)。在某些情况下,可能会制作其他临时副本,如果要复制的集合非常大,则应用程序应(意识到/监视)制作副本所需的大量资源。 | |
G1优化 | 默认的堆区域大小计算已更改为默认情况下返回较大的区域。计算仍以2048个区域为目标,但是两个方面发生了变化,这些更改提高了启动和运行时性能 1、仅考虑最大堆大小。旧的计算还考虑了初始堆大小,但是当未设置堆大小时,这可能会产生意外的行为。 2、区域大小四舍五入到最接近的2的幂,而不是减小。在最大堆大小不是2的幂的情况下,这将返回更大的区域大小。 | |
ZGC | Z垃圾收集器(ZGC)现在可以在生产中使用,不再标记为实验功能。通过使用-XX:+UseZGC命令行选项启用ZGC | 转正了 |
模式匹配 | 第二预览版 | |
redcord | jdk16转正 | 第二预览版 |
Sealed Classes | 第一预览版 |
java16
概述 | 说明 | 备注 |
redcord |
| 简单理解为lombok |
java.time 根据时段获取时间 |
| |
Stream新增toList方法 |
| |
密封类 | jdk17有调整 | 第二预览版 |
模式匹配instanceof |
| 转正 |
打包工具 | 提供jpackage用于打包独立Java应用程序的工具。将jpackage tool被引入作为JDK 14的孵化工具通过JEP343它在JDK 15仍然是一个孵化工具,以便有时间额外的反馈。它已在JDK16中从孵化升级为可用于生产的功能。由于此过渡,jpackage模块的名称已从更改jdk.incubator.jpackage为jdk.jpackage。 |
java17-长期支持版本
概述 | 说明 | 备注 |
switch新增模式 |
| 预览 |
Realed class密封类 |
| |
随机数增强 | 为伪随机数生成器 (PRNG) 提供新的接口类型和实现,包括可跳转的 PRNG 和额外的一类可拆分 PRNG 算法 (LXM) | |
浮点运算更加严格 | 简化数字敏感库开发,包括java.lang.Math和java.lang.StrictMath(对开发无实际意义) | |
Parallel GC | Parallel GC 默认启用自适应并行处理,并行GC确定java.lang.ref.Reference在垃圾收集期间用于处理实例的最佳线程数。 默认-XX:ParallelRedProcEnabled: true。在有多个线程可用于垃圾收集的机器上,明显改善了垃圾收集暂停的阶段,如果遇到垃圾收集暂停增加的情况,可以通过-XX:ParallelRedProcEnabled在命令行上指定到原始行为 | |
增强TreeMap | TreeMap 没有对 putIfAbsent()、computeIfAbsent()、computeIfPresent()、compute() 方法的专门实现。默认实现经常导致两次树遍历,这会损害性能 | |
弃用Socket实现工厂机制 | 弃用并最终删除用于为java.net 包中的套接字类型静态配置系统范围工厂 的 API 点 | |
统一日志支持异步日志刷新 | 为了避免在使用统一日志的线程中出现不希望的延迟,用户现在可以请求统一日志系统以异步模式运行。通过传递命令行选项来完成的-Xlog:async。在异步日志模式下,日志站点将所有日志消息排入缓冲区。独立线程负责将它们刷新到相应的输出。中间缓冲区是有界的。缓冲区耗尽时,将丢弃排队消息。可以使用命令行选项控制中间缓冲区的大小-XX:AsyncLogBufferSize=<bytes>。 | |
新增 java.time.InstantSource | java.time.InstantSource引入了一个新界面。这个接口是一个抽象java.time.Clock,只关注当前时刻,不涉及时区 | |
javadoc工具 | 新的“新 API”页面和改进的“弃用”页面,JavaDoc 现在可以生成一个页面,总结最近 API 的变化。要包含的最新版本列表是使用--since命令行选项指定的。这些值用于查找@since要包含在新页面上的具有匹配标签的声明。该--since-label命令行选项提供了“新API”页面的标题文本使用。 |
java目前项目划分
Java 的变化速度从未如此之快——如今,该语言的新版本每六个月就会发布一次,而发展道路中的以下三大主要项目,将有助于确定 Java 的未来方向。
项目一:Loom 项目
尝试改进 Java 语言的并发处理方式,或者说是在对计算机在不同指令集执行之间切换能力的探索。
甲骨文公司 Loom 项目技术负责人 Ron Pressler 在 QCon 伦敦 2019 大会上向希望编写软件以处理并发任务的 Java
开发者们提出了两种都不够完美的选项:要么编写无法通过扩展处理大量并发任务的“简单同步阻塞代码”,要么编写
可扩展但编写难度极高且调试过程复杂的异步代码。
为了寻求解决这个问题的方法,Loom 项目引入了一种将任务拆分为线程的新方法——所谓线程,即是指计算机在运
行指令时的最小可能执行单元。在这方面,Loom 引入了被称为 fibers 的新型轻量级用户线程。
他在大会上指出,“利用 fibers,如果我们确保其轻量化程度高于内核提供的线程,那么问题就得到了解决。大家将
能够尽可能多地使用这些用户模式下的轻量级线程,且基本不会出现任何阻塞问题。”
利用这些新的 fibers,用户将能够扩展 Java 虚拟机(JVM)以支持定界延续(delimited continuations)机制,从而
使得指令集的执行实现暂停以及恢复。对这些延续进行暂停与恢复的任务将由 Java 中的 ForkJoinPool 调度程序以异
步模式处理。
根据说明文档所言,fibers 将使用与 Java 现有 Thread 类非常相似的 API,这意味着 Java 开发人员的学习曲线应该
不会太过陡峭。
项目二:Amber 项目
Amber 项目的目标,在于支持“更小、面向生产力的 Java 语言功能”的开发,从而加快将新功能添加至 Java 语言中的速度。
项目三:Valhalla 项目
Valhalla 项目专注于支持“高级”JVM 与语言功能的开发。