vlambda博客
学习文章列表

这年头,能坐上火箭的东西不多啊!Java 版本号算一个!

Sun 早已经不在了,如今只剩 Oracle,也就是 Java 目前的抚养人。从 2019 年 4 月 16 号开始,Oracle 版本的 JDK,已经宣布收费。目前有更多的企业转向 OpenJDK。


Java8 版本之后,Java 开启了每半年升级一次版本的速度,版本号坐上了火箭!但这么多版本并不是每个都长期维护的,我们还是要盯紧它的 LTS 版本。目前的 LTS 版本有:7、8、11、17,跨度还是很大的。


1、历史


首先来看一下 Java 的历史,这带给我们饭碗的技术到底是什么时候诞生的。


  • 1995 年 5 月 23 日,Sun 正式发布 Java 语言和 HotJava 浏览器。
  • 1996 年 1 月,Sun 公司发布了 Java 的第一个开发工具包(JDK 1.0),和大多数小青年的年龄相仿,20多岁的年龄。
  • 1996 年 4 月,10 个最主要的操作系统供应商申明将在其产品中嵌入 Java 技术。发展可真是迅雷不及掩耳。
  • 1996 年 9 月,约 8.3 万个网页应用了 Java 技术来制作。这就是早年的互联网,Java Applet 那么多问题,真香。
  • 1996 年 10 月,Sun 公司发布了 Java 平台第一个即时编译器(JIT)。这一年,很不平凡。
  • 1997 年 2 月 18 日,JDK1.1 面世。在随后的三周时间里,达到了 22 万次的下载量。PHP 甘拜下风。
  • 1999 年 6 月,Sun 公司发布第二代 Java 的三大版本 J2SE、J2ME、J2EE。Java2 发布。开始飘啦,现象就是出解决方案。
  • 2000 年 5 月 8 日,JDK1.3 发布。四年升三版,不算过分吧。
  • 2000 年 5 月 29 日,JDK 1.4 发布。获得 Apple 公司 Mac OS 的工业标准的支持。
  • 2001 年 9 月 24 日,Java EE 1.3 发布。注意是 EE,开始臃肿无比。
  • 2002 年 2 月 26 日,J2SE 1.4 发布,自此 Java 的计算能力有了大幅提升,与J2SE 1.3 相比,其多了近 62% 的类与接口。
  • 2004 年 9 月 30 日 18:00,J2SE1.5 发布。1.5 正式更名为 Java SE 5.0。
  • 2005 年 6 月,在 Java One 大会上,Sun 公司发布了 Java SE 6。
  • 2009 年 4 月 20 日,Oracle 宣布收购 Sun,该交易的总价值约为 74 亿美元。2010 年 Java 编程语言的创始人 James Gosling 从 Oracle 公司辞职。一朝天子一朝臣,国外也不例外。
  • 2011 年 7 月 28 日,Oracle 公司终于发布了 Java 7,这次版本升级经过了将近 5 年时间。
  • 2014 年 3 月 18 日,Oracle 公司发布了 Java 8,这次版本升级为 Java 带来了全新的 Lambda 表达式。


小碎步越来越快,好怕很快两位数装不下 Java 的版本号。


目前 Java 的版本已经更新到 17 版本,但市场主流还是使用的 JDK 8。


2、最近更新


有些我们现在认为理所当然的功能,在 Java 的早期版本是没有的。我们从 Java7 说起。以下内容仅供参考,详细列表见 OpenJDK JEP 列表。


https://openjdk.java.net/jeps/0


2.1 Java 7


Java 7 增加了以下新特性:


  • try、catch 能够捕获多个异常
  • 新增 try-with-resources 语法
  • JSR341 脚本语言新规范
  • JSR203 更多的 NIO 相关函数
  • JSR292 InvokeDynamic
  • 支持 JDBC 4.1规范
  • 文件操作的 Path 接口、DirectoryStream、Files、WatchService
  • jcmd 命令
  • 多线程 fork/join 框架
  • Java Mission Control


2.2 Java 8


Java 8 也是一个重要的版本,在语法层面有更大的改动,支持了 Lamda 表达式,影响堪比 Java 5 的泛型支持。


  • 支持 Lamda 表达式
  • 支持集合的 Stream 操作
  • 提升了 HashMap 的性能(红黑树)
  • 提供了一系列线程安全的日期处理类
  • 完全去掉了 Perm 区


2.3 Java 9


  • JSR376 Java 平台模块系统

  • JEP261 模块系统

  • jlink 精简 JDK 大小

  • G1 成为默认垃圾回收器

  • CMS 垃圾回收器进入废弃倒计时

  • GC Log 参数完全改变,且不兼容

  • JEP110 支持 HTTP2,同时改进 HttpClient 的 API,支持异步模式

  • jshell 支持类似于 Python 的交互式模式


2.4 Java10


  • JEP304 垃圾回收器接口代码进行整改
  • JEP307 G1 在 FullGC 时采用并行收集方式
  • JEP313 移除 javah 命令
  • JEP317 重磅 JIT 编译器 Graal 进入实验阶段


2.5 Java11


  • JEP318 引入 Epsilon 垃圾回收器。这个回收器什么都不干,适合短期任务
  • JEP320 移除了 JavaEE 和 CORBA Module,应该要走轻量级路线
  • Flight Recorder 功能,类似 JMC 工具里的功能
  • JEP321 内置 HttpClient 功能 java.net.http 包
  • JEP323 允许 Lambda 表达式使用 var 变量
  • 废弃了 -XX+AggressiveOpts 选项
  • 引入了 ZGC,依然是实验特性


2.6 Java12


  • JEP189 先加入 ShenandoahGC
  • JEP325 switch 可以使用表达式
  • JEP344 优化 G1 达成预定目标
  • 优化 ZGC

2.7 Java13


  • JEP354 yield 替代 break
  • JEP355 加入 Text Block,类似 Python 的多行文本
  • ZGC 的最大 heap 大小增大到 16TB
  • 废弃 rmic Tool 并准备移除

2.8 Java14


  • JEP343 打包工具引入
  • JEP345 实现了 NUMA-aware 的内存分配,以提升 G1 在大型机器上的性能
  • JEP359 引入了预览版本的 Record 类型,可用于替代 Lombok 的部分功能
  • JEP364 之前的 ZGC 只能在 Linux 上使用,现在 Mac 和 Windows 上也能使用ZGC了
  • JEP363 正式移除 CMS,一些优化参数在 14 版本普及之后,将不复存在

OpenJDK 64-Bit Server VM warning: Ignoring option UseConcMarkSweepGC; support was removed in 14.0


2.9 Java15


  • JEP 371 引入了隐藏类的功能,这些隐藏类不能被其他类的字节码直接使用。
  • JEP 378 Text Block。终于正式加入了多行文本的功能。
  • JEP 372 删除 Nashorn JavaScript 脚本引擎和 API。
  • JEP 374 禁用和弃用偏向锁定,默认情况下禁用偏向锁定,并弃用所有相关的命令行选项。所以你现在的面试经验都是基于 Java 8 的。
  • JEP 375 更简洁地使用 instanceof 关键字。
  • JEP 377 ZGC 转变为生产功能。


2.10 Java16


  • JEP 347 增加了 C++ 14 语言特性
  • JEP 395 Record 类型转正
  • JEP 338 向量计算支持,这在游戏开发中非常有用
  • JEP 380 UDS相关API支持
  • JEP 392 jpackage工具正式转正


2.11 Java17


  • JEP 398 废弃了 Applet API
  • JEP 407 RMI 远程调用也被废弃了
  • JEP 406 switch 语句支持模式匹配了,语法也有较大改变
  • JEP 414 增强了向量计算方面的支持


3. 展望


有点规模的互联网公司,行事都会有些谨慎。虽然 JVM 做到了向下版本的兼容,但是有些性能问题还是不容忽视,尝鲜吃螃蟹的并不是很多。


现在用得最多的,就是Java 8 版本。如果你服务器上用到了这个,那么用得最多的垃圾回收器就是 CMS 或者 G1。随着 ZGC 越来越稳定,CMS 终将会成为过去式。


目前,最先进的垃圾回收器,叫做 ZGC。它立了 3 个 flag:


  • 支持 TB 级堆内存(最大 4T)
  • 最大 GC 停顿 10ms
  • 对吞吐量影响最大不超过 15%


每一个版本的发布,Java 都会对以下进行改进:


  • 优化垃圾回收器,减少停顿,提高吞吐;
  • 语言语法层面的升级,这部分在最近的版本里最为明显;
  • 结构调整。减少运行环境的大小,模块化;
  • 废弃掉一些承诺要废弃的模块。


那么 JVM 将向何处发展呢?


以目前来看,比较先进的技术,就有刚才提到的垃圾回收阶段的 ZGC,能够显著减少 STW 的问题。另外,GraalVM 是 Oracle 创建的一个研究项目,目标是完全替换 HotSpot。它是一个高性能的JIT编译器,接收 JVM 字节码,并生成机器代码。未来,会有更多的开发语言,运行在 JVM 上,比如 Python、Ruby 等。


Poject Loom 致力于在 JVM 层面,给予 Java 协程(Fiber)的功能,Java 的程序的并发性能会上一个档次。


Java 版本大部分是向下兼容的。能够做到这个兼容,是非常不容易的。但 Java 的特性越加越多,如果开发人员不能进行平滑的升级,会是一个非常严重的问题,JVM 也将会在这里花费非常大的精力。


那 JVM 将聚焦在哪些方面呢?又有哪些挑战?我大体总结了几点:


  • 内存管理依然是非常大的挑战。 未来会有更厉害的垃圾回收器来支持更大的堆空间
  • 多线程和协程。 未来会加大对多核的利用,以及对轻量级线程的支持;
  • 性能。 增加整个 JVM 的执行效率,这通常是多个模块协作的结果;
  • 对象管理和追踪。 复杂的对象,有着复杂的生命周期。加上难以预料的内存申请方式,需要更精准的管理优化;
  • 可预测性以及易用性。 更少的优化参数,更高的性能;
  • 更多 JVM 监控工具。 提供对 JVM 全方面的监控,跟踪对象,在线优化;
  • 多语言支持。 支持除了 Java 语言之外的其他开发语言,能够运行在 JVM 上。


4. 小结


Java9 之后,已经进入了快速发布阶段,大约是每半年发布一次。但一个奇怪的现象就是,好像大家都在用 Java 8,风吹不倒雨打不动。任你版本随意更新,我自岿然不动。

对 Java 来说,现在谈革新还为时太早,什么时候大家有积极性把 Java 8 替换下去,才算是 Java 的一次涅槃吧。


- EOF -

推荐阅读   点击标题可跳转


看完本文有收获?请转发分享给更多人

关注「ImportNew」,提升Java技能

点赞和在看就是最大的支持❤️