jdk11
性能提升
更好的垃圾收机制、更快的类加载器, 加快应用程序的运行速度。综合评估,从Java 8 升级到 Java 11,G1GC平均速度提升16.1%,ParallelGC为4.5%(基于OptaPlanner的用例基准测试表明)
特性和改进
局部变类型推断、新的 API、HTTP/2客户端、Lambda表达式的新特性等,这些新特性可以提高开发效率。
支持最新的技术和框架
许多新的技术和框架已经或即将开始依赖于JDK11或以上版本,升级后可以保证应用程序能够分利用这些新的技术和框架。
长期支持版本
JDK11是Oracle官方发布的一个长期支持(LTS),意味着它将获得长期的更新和支持,有助于保持用程序的稳定性和可靠性。
1、目前市面上有 超过 56%的应用程序使用了JDK 11,Java 8 的使用从2020年的84%降低到了现在的32%左右。大部分公司在这三年之间都升级到了JDK 11 或者 JDK 17这两个LTS版本上面。
2、垃圾收集器使用情况来看,JDK11版本及以上 G1使用率最高,占比高达65%
JDK11带来了哪些新特性
GC改进
默认垃圾回收器改为G1,废弃CMS垃圾回收器,引入ZGC垃圾回收器(可伸缩低延迟垃圾收集器)
模块化
Java9引入了对于模块化软件支持,而Java11进一步扩展了这种特性。模块化让应用程序 更精简,减少对其他类库的依赖和冗余代码,提高运行效率和安全性。
语法增强
局部变量推断,引入var局部变量类型,允许开发人员省略通常不必要的局部变量类型初始化声明
Lambda表达式简化,内部可以使用var
- 接口中可以定义私有方法,可以实现接口方法的访问控制和代码复用
API增强
HTTPClient标准化支持:强大而灵活的HTTP客户端API,支持多协议(HTTP/2、WebSocket)、异步非阻塞、流操作和连接池等特性。ps:再也不需要用第三包 HttpClient 工具包
字符串方法增强:isBlank、lines、strip、stripLeading、stripTrailing和repeat
Files增强:readString、WriteString
InputStream增强:transferTo(流快速拷贝)
stream增强,dropWhile(从集合中删除满足的)、takeWhile(从集合中获取满足的)、ofNullable
集合工厂方法:Sets.of()、List.of()、Map.of()、Map.ofEntries(),举例:List<String> list = List.of("Java", "Python", "C++");
JDK选择
自从2019年1月起,Oracle JDK后续的版本开始商用收费,所以推荐大家选择OpenJDK11,OpenJDK和OracleJDK功能上没有差异,支持免费商用。
新特性实践-模块化
引入了模块化系统。通过模块化,Java本身也得以进行模块化改进。
模块化指的是JAVA平台的模块系统(Java Platform Module System),简称JPMS。JPMS引入一种新方式来组织和构建Java应用程序,它将代码分为相互独立、可复用的模块。每个块都有自己的命名空间,明确声明并控制其他模块的访问权限。这种模块化设计使得开发人员能够更好地维护复杂的应用程序,提高代码的复用性、可维护性和安全性,同时提升应用的加载速度和性能。最大的特点是可以定义模块描述符来隔离module(Jar包)内部类的访问权限。
JDK17
JDK17是Oracle官方在2021年9月14日发布的一个长期支持(LTS)版本
性能提升 从Java 11 升级到 Java 17,G1GC平均速度提升8.66%,ParallelGC为6.54%
最大的亮点是带来了稳定版的ZGC垃圾回收器,达到亚毫秒级停顿。
新语法和特性
Switch表达式简化、Text Blocks文本块、instanceof 的模式匹配升级和NullPointerException提示信息改进等
支持最新的技术和框架
Spring framework6 和Spring Boot3 都默认使用 Java 17作为最低版本
JVM改进
1、ZGC垃圾回收器从实验性功能更改为正式产品功能,从JDK11引入以来,经过持续的迭代升级,目前已经足够稳定。需要手动开启,开启方式:-XX:+UseZGC
2、G1垃圾回收器仍然作为默认垃圾回收器,进行改进升级,主要包括可中止的混合收集集合、NUMA 可识别内存分配等
3、JDK14开始删除 CMS 垃圾回收器
4、JDK14开始弃用 ParallelScavenge 和 SerialOld GC 的组合使用
5、JDK15禁用偏向锁,默认禁用:-XX:+UseBiasedLocking
6、NullPointerException 提示信息改进
record 是 JDK 14 引入的关键字,用于声明不可变的数据类。它适用于存储纯粹的值类型数据,如接口传输数据、坐标点和只读的日志记录。与 lombok 相比,record 简化了定义纯粹数据类型的过程
定义Point类,使用关键字record,未定义get/set
类被final修饰,继承自java.lang.Record
所有属性都 被final修饰
自带tostring(),hashcode(),equals等方法实现
instance模块匹配升级
SpringBoot升级
SpringBoot版本升级到2.7.15,Spring版本升级为5.3.29
用中间件升级
6.4.1、Lombok版本升级到1.18.20以上
6.4.2、swgger问题,springfox3.0.0和springboot2.7版本不兼容
AKS升级(针对直接从JDK8升级的情况)java11 删除了 Java EE modules,其中就包括 java.xml.bind (JAXB)。
开启ZGC
启动参数中配置:-XX:+UseZGC
还不快抢沙发