James Gosling:对继续坚守 Java8 的朋友,我想说“是时候作出改变了”。新系统全方位性更强、速度更快、错误也更少、扩展效率更高。无论从哪个角度看,大家都有理由接纳 JDK17。确实,大家在从 JDK8 升级到 JDK9 时会遇到一个小问题,这也是 Java 发展史中几乎唯一一次真正重大的版本更替。大多数情况下,Java 新旧版本更替都非常简单。只需要直接安装新版本,一切就能照常运作。长久以来,稳定、非破坏性的升级一直是 Java 的招牌特性之一,我们也不希望破坏这种良好的印象。

这是James Gosling最近在接受采访时,被问及“Java 的版本一直以来更新得比较快,几个月前发布了最新的 Java 17 版本,但 Java 8 仍然是开发人员使用的主要版本,新版本并未‘得宠’,您认为主要的原因是什么?”时的回答。

而随着即将正式发布的Spring framework 6 和Spring Boot 3,最低的Java版本就直接以Java 17起步:

这么一来,如果到时候为了使用最新版本的Spring功能,我们不得不从Java 8升级到Java 17,而期间跳过的版本主要内容如果我们不了解的话,必定会遇到许多问题。

所以,这里,强哥就帮大家总结了Java 9到Java 17的主要内容更新,值得大家收藏。

Java 9

主要更新内容:

  • 平台模块系统(Jigsaw项目)

  • 接口私有方法

  • Try-With Resources

  • @SafeVarargs注释

  • 集合工厂方法

  • Process API改进

  • JShell:javashell(REPL)

  • 流API改进

Java 9最大特性就是引入了模块化的概念。就是将类型和资源封装在模块中,并仅导出其他模块要访问其公共类型的软件包。有些类似前端框架中的export和import。

如果模块中的软件包未导出或打开,则表示模块的设计人员不想在模块外部使用这些软件包。这样的包可能会被修改或甚至从模块中删除,无需任何通知。

与此同时,模块化将rt.jar包做了拆分,导致了ClassLoader的相应调整:

Java 9之前的ClassLoader

  • Bootstrap ClassLoader加载rt.jar,jre/lib/endorsed

  • Ext ClassLoader加载jre/lib/ext

  • Application ClassLoader加载-cp指定的类

Java 9及之后的ClassLoader

  • Bootstrap ClassLoader加载lib/modules

  • Ext ClassLoader更名为Platform ClassLoader,加载lib/modules

  • Application ClassLoader加载-cp,-mp指定的类

  • Application ClassLoader父类不再是URLClassLoader

而接口私有方法,允许我们声明有助于在非抽象方法之间共享公共代码的私有方法。在Java 9之前,在接口中创建私有方法会导致编译时错误。

Java 10

主要更新内容:

  • 局部变量的类型推断。

  • 应用类数据共享。为改善启动和占用空间,在现有的类数据共享(“CDS”)功能上再次拓展,以允许应用类放置在共享存档中

  • 向G1引入并行Full GC

  • 线程局部管控。允许停止单个线程,而不是只能启用或停止所有线程

  • 基于Java的JIT 编译器(试验版本)

局部变量类型推断是Java10中为开发人员提供的最大的新特性。它将类型推断添加到带有初始值设定项的局部变量声明中。局部类型推断只能在以下情况下使用:

  • 仅限于具有初始值设定项的局部变量

  • 增强for循环的索引

  • 在for循环中声明的本地

其实就是类似JS的var变量,用法如下:


var numbers = List.of(1, 2, 3, 4, 5); // inferred value ArrayList<String>
// Index of Enhanced For Loop
for (var number : numbers) {System.out.println(number);
}
// Local variable declared in a loop
for (var i = 0; i < numbers.size(); i++) {System.out.println(numbers.get(i));
}

向G1引入并行FullGC:G1垃圾收集器在jdk9中是默认的。G1垃圾收集器避免了任何完全的垃圾收集,但是当用于收集的并发线程不能足够快地恢复内存时,用户的体验就会受到影响。

此更改通过使完全GC并行来改善G1最坏情况下的延迟。G1收集器的mark-sweep compact算法作为此更改的一部分被并行化,当用于收集的并发线程不能足够快地恢复内存时,它将被触发。

基于Java的实验性 JIT 编译器:Java 10 中开启了基于Java 的JIT编译器Graal,并将其用作Linux/x64平台上的实验性JIT编译器开始进行测试和调试工作。

Graal 是一个以 Java 为主要编程语言、面向Java bytecode 的编译器。与用C++实现的C1及C2相比,它的模块化更加明显,也更加容易维护。将 Graal 编译器研究项目引入到 Java 中,或许能够为 JVM 性能与当前 C++ 所写版本匹敌(或有幸超越)提供基础。

Java 11(LTS)

主要更新内容:

  • GC垃圾回收器

  • 本地变量类型推断

  • 字符串加强

  • 集合加强

  • Stream 加强

  • Optional 加强

  • InputStream 加强

  • HTTP Client API

  • 化繁为简,一个命令编译运行源代码

最大变化是Linux版本新增了ZGC。ZGC在Linux X64下的JDK 11以上可用,Mac和Windows上需要JDK 15可用。Java 11 ZGC实测gc时间稳定在3ms左右(当然也许跟场景有关,官方口径一般在10ms以下)。

ZGC一个并发,基于region,压缩型的垃圾收集器,只有root扫描阶段会STW,因此GC停顿时间不会随着堆的增长和存活对象的增长而变长。ZGC和G1停顿时间比较:


ZGCavg: 1.091ms (+/-0.215ms)95th percentile: 1.380ms99th percentile: 1.512ms99.9th percentile: 1.663ms99.99th percentile: 1.681msmax: 1.681ms
G1avg: 156.806ms (+/-71.126ms)95th percentile: 316.672ms99th percentile: 428.095ms99.9th percentile: 543.846ms99.99th percentile: 543.846msmax: 543.846ms

同时,不得不提的一点是:随着Java 11的发布,在2018.9之后,Oracle JDK正式商用(开发不收费,但是运行线上业务收费)。但是与此同时,Oracle宣布,OpenJDK与Oracle JDK在功能上不会有区别。并且,OpenJDK 11 RTS将会由红帽社区进行维护。这样,更加增加了可靠性与保证问题的及时解决。

Java 12

主要更新内容:

  • Shenandoah: 低暂停时间的GC

  • Switch表达式

  • JVM常量API

  • 默认类数据共享归档文件

  • 可终止的G1 Mixed GC

  • G1及时返回未使用的已分配内存

Java 12中引入一个新的垃圾收集器:Shenandoah,它是作为一中低停顿时间的垃圾收集器而引入到Java 12中的,其工作原理是通过与Java应用程序中的执行线程同时运行,用以执行其垃圾收集、内存回收任务,通过这种运行方式,给虚拟机带来短暂的停顿时间。

同时,Java12中继续改善了G1 GC:为了实现向操作系统返回最大内存量的目标,G1 将在应用程序不活动期间定期执行或触发并发周期以确定整体 Java 堆使用情况。这将导致它自动将 Java 堆的未使用部分返回给操作系统。而在用户控制下,可以可选地执行完整的 GC,以使返回的内存量最大化。

如果混合 GC 的 G1 存在超出暂停目标的可能性,则使其可中止。

受篇幅限制,更详细的内容请点这里:点我点我

关注公众号获取更多内容,有问题也可在公众号提问哦:

强哥叨逼叨

叨逼叨编程、互联网的见解和新鲜事

Java 9~Java 17主要更新了什么?相关推荐

  1. 4.6 W 字总结!Java 11—Java 17特性详解

    作者 | 民工哥技术之路 来源 | https://mp.weixin.qq.com/s/SVleHYFQeePNT7q67UoL4Q Java 11 特性详解 基于嵌套的访问控制 与 Java 语言 ...

  2. Java面试题17 牛客 下面哪个选项正确创建socket连接?

    Java面试题17 牛客 下面哪个选项正确创建socket连接? Socket s = new Socket(8080); Socket s = new Socket("192.168.1. ...

  3. JDK 7-JDK 21:Oracle Java SE 支持路线图/Oracle Java SE Support Roadmap 持续更新

    文章目录 前言 一.Oracle Java SE 产品版本 二.Java SE 8 的公共更新结束 三.参考文档 总结 前言 几十年来,Java 生态系统已经成功地经历了这个过程,经历了十次主要的平台 ...

  4. java项目第17期-小程序团购+商城源码【毕业设计】

    java项目第17期-小程序团购+代理商城源码 1.产品介绍 java小程序+大后台web商城源码 基于ssm的一款电子商城,系统采用maven的父子结构, 1.后台web商城包含的模块有: 会员管理 ...

  5. JAVA17版本_我的世界JAVA版1.17版本内容预览

    我的世界JAVA版的1.17版本预计在2021年中期推出,1.17版本将会有哪些内容呢?下面就给大家带来我的世界JAVA版1.17版本内容预览,以供玩家参考. 版本介绍 1.17是地洞山崖的首个正式版 ...

  6. 2020年 近期出去面试Java的总结(持续更新)

    近期出去面试Java的总结 一.Java基础 1.Java的类加载顺序 对于有继承关系的加载顺序 2.Java的创建对象的几种方式 1.使用new关键字 2.使用反射机制 1)使用Class类的new ...

  7. paip.提升用户体验--提升java的热部署热更新能力

    paip.提升用户体验--提升java的热部署热更新能力 想让java做到php那么好的热部署能力  "fix online"/在线修复吗??直接在服务器上修改源码生效,无需重启应 ...

  8. minecraft java版皮肤查看_我的世界官网针对Minecraft Java版玩家皮肤的更新

    我的世界官网针对Minecraft Java版玩家皮肤的更新!你可能昨天已经在其他网站了解到了一些和下载Minecraft Java版皮肤有关的新闻,这些新闻指出,一个Minecraft Java版皮 ...

  9. 如何看待:Oracle Java SE 8 发行版更新 ? --- 变向激励学习 JDK 10 吗?

    阅读, 一方面获得信息, 二方面借鉴同样信息如何传达之方法, 三方面领会信息透出的意图.情感.精神.要旨. 基于此,本文适当解读如下: 一方面, 对于 Java 8 的技术更新支持要终止,个人使用截止 ...

最新文章

  1. 多模态人物识别技术及其在视频场景中的应用 | CSDN技术公开课
  2. linux floating ip,Floating IP in OpenStack Neutron
  3. SicilyRails
  4. Python成长之路第二篇(3)_字典的置函数用法
  5. python3创建一个游戏窗口
  6. 如何使得账户密码永不过期
  7. 【剑指offer】面试题52:两个链表的第一个公共节点(java)
  8. Linux Shell脚本_历史命令显示操作时间
  9. 国产“电动牦牛”亮相,负重 160 公斤健步如飞!
  10. FPM打包工具 可以把源码包制定为rpm包 是自动化部署的环节
  11. 现在动画制作用什么软件?
  12. linux安装p12,用命令行安装mobileprovision和p12证书
  13. Linux dev是什么文件,linux dev文件详解
  14. 微软拼音输入法如何打开添加表情与颜文字?
  15. Linux系统下搭建域名服务器 (转http://elaine.blog.51cto.com/336598/65449)
  16. 怎么理解java关键字volatile(附最新阿里面题)
  17. 个人第1次作业:阅读与准备作业
  18. 触摸开关模块,TTP223
  19. SpringCloudGateway路由定义存至Mysql数据库
  20. 计算机图形学 学习笔记 图元的属性

热门文章

  1. springboot+校园新闻数据化系统-计算机毕设 附源码99293
  2. 自己打包部署iOS app分发
  3. centos7.2 下 ffmpeg交叉编译(安卓版x86_64)
  4. HTTP调用状态返回码
  5. c# 学习笔记 第一天 ——刘铁猛老师
  6. Java(13)- 抽象类
  7. 堆外内存的介绍及释放
  8. IEEE754标准: 浮点数在内存中的存储方式
  9. 广东工程职业技术学院计算机二级,高职高考必看|全面了解广东工程职业技术学院...
  10. Java实现图片上传到服务器