这年头,能坐上火箭的东西不多啊,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,欢迎添加好友,进一步交流。
标签:JEP,Java,版本,版本号,这年头,支持,JVM,ZGC 来源: https://blog.csdn.net/mxy2404830/article/details/121873045