查看原文
其他

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

小姐姐养的狗 小姐姐味道 2022-09-10

原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。

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的第一个开发工具包(JDK1.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日,JDK1.4发布。获得Apple公司Mac OS的工业标准的支持。
  • 2001年9月24日,Java EE 1.3发布。注意是EE,开始臃肿无比。
  • 2002年2月26日,J2SE1.4发布,自此Java的计算能力有了大幅提升,与J2SE1.3相比,其多了近62%的类与接口。
  • 2004年9月30日18:00PM,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公司发布了Java8,这次版本升级为Java带来了全新的Lambda表达式。

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

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

2、最近更新

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

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

2.1、Java7

Java7增加了以下新特性。

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

2.2、Java8

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

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

2.3、Java9

  • 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 Modules,应该要走轻量级路线
  • 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 Blocks,类似Python的多行文本
  • ZGC的最大heap大小增大到16TB
  • 废弃rmic Tool并准备移除

2.8、Java14

  • JEP343 打包工具引入
  • JEP345 实现了NUMA-aware的内存分配,以提升G1在大型机器上的性能
  • JEP359 引入了preview版本的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 Blocks。终于正式加入了多行文本的功能。
  • JEP 372 删除Nashorn JavaScript脚本引擎和API。
  • JEP 374 禁用和弃用偏向锁定,默认情况下禁用偏向锁定,并弃用所有相关的命令行选项。所以你现在的面试经验都是基于Java8的。
  • 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都会对以下进行改进:

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

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

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

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

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

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

4、小结

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

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

作者简介:小姐姐味道 (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。我的个人微信xjjdog0,欢迎添加好友,进一步交流。

推荐阅读:

1. 玩转Linux
2. 什么味道专辑

3. 蓝牙如梦
4. 杀机!
5. 失联的架构师,只留下一段脚本
6. 架构师写的BUG,非比寻常

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存