这年头,能坐上火箭的东西不多啊!Java 版本号算一个!
The following article is from 小姐姐味道 Author 小姐姐养的狗
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技能
点赞和在看就是最大的支持❤️