这年头,能坐上火箭的东西不多啊!Java版本号算一个!
原创:小姐姐味道(微信公众号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都会对以下进行改进:
优化垃圾回收器,减少停顿,提高吞吐 语言语法层面的升级,这部分在最近的版本里最为明显 结构调整。减少运行环境的大小,模块化 废弃掉一些承诺要废弃的模块
那么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,欢迎添加好友,进一步交流。
推荐阅读:
3. 蓝牙如梦
4. 杀机!
5. 失联的架构师,只留下一段脚本
6. 架构师写的BUG,非比寻常