这年头,能坐上火箭的东西不多啊!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技能
点赞和在看就是最大的支持❤️