聊聊JDK1.0到JDK20的那些事儿
1.前言
最近小组在开展读书角活动,我们小组选的是《深入理解JVM虚拟机》,相信这本书对于各位程序猿们都不陌生,我也是之前在学校准备面试期间大致读过一遍,emm时隔多日,对里面的知识也就模糊了。这次开始的时候从前面的JDK发展史和JVM虚拟机家族着手,之前都是粗略读过,这次通过查阅相关资料并收集在每一个JDK版本演化期间所发生的的一些趣闻,发现还是比较有意思的,以下是关于有关JDK发展史的总结分享。
2.JDK各版本特性及趣闻
- JDK版本演变及各版本特性
◦JDK 1.0 (1996):
包含Java语言、Java类库和Java虚拟机。支持图形用户界面(GUI)、数据库连接(JDBC)等功能。
"Oak" 是 Java 语言的前身,由于“Oak”这个名称已经被其他公司使用了,因此在1995年,Java 的创造者——Sun 公司决定将其改名为“Java”。 据说,这个名称是来自于一家咖啡店。当时,在设计 Java 语言的时候,创始团队成员到一家咖啡店买咖啡时,发现这家咖啡店的名字叫做“Java Coffee”,于是决定以“Java”作为新的名称。
◦JDK 1.1 (1997-2):
增加了内部类、JavaBeans、远程方法调用(RMI)等功能。
◦JDK 1.2 / Java 2 (1998-12):
引入了Swing组件、反射机制和动态代理、集合框架、Java 2D和Java 3D图形等特性。
这是Java SE第一个真正具有商业价值的版本。该版本引入了Java命名空间(namespace)等特性,使得Java应用程序能够更好地组织和管理。在此阶段并存过三个虚拟机,Classic VM、HotSpot VM和Exact VM,其中HotSpot在1999年4月诞生。
◦JDK 1.3 (2000-5):
增加了Java平台的功能、底层类库、增强了AWT和Swing用户界面等。
当时Sun公司正在面对来自Microsoft的严峻挑战,后者推出了.NET框架,试图颠覆Java的地位。因此,Sun公司决定加快Java的开发速度,增强其竞争力。
◦JDK 1.4LST (2002-2):
引入Java管理扩展(JMX)、新的I/O API,称为NIO(New I/O)、断言、内置的XML解析器(SAX和DOM)等特性。
这是Java SE中功能最全面的版本之一。该版本引入了NIO和XML解析器等新特性,提高了Java程序的性能和扩展性。
◦JDK 5.0 / Java 1.5 (2004-9):
引入了泛型、枚举类型、自动装箱和拆箱、注解、并发编程API等特性。
这是Java SE中功能最丰富的版本之一。该版本引入了泛型、类型安全的枚举、自动装箱/拆箱和注解等新特性,使得Java程序的编写更加简洁和精简。
Sun公司从这个版本开始放弃了谦逊的“JDK 1.x”的命名方式,将产品版本号修改成了“JDK x”。Sun 公司这样做的原因是,从 JDK 5.0 开始,Java 平台的发布计划每年发布一个版本,为了避免版本号混淆,同时更好地传达 Java 平台的快速迭代和更新,采用了新的命名方式。
◦JDK 6 (2006-12):
引入了JDBC 4.0 API、Java监视与管理控制台(JConsole)、增加了对动态语言的支持、改进的GUI工具包(Swing)、改进的Java Web Start、改进的性能与安全性等特性。
JDK的更新没有能够继续维持两年发布一个主版本的研发速度,这导致了JDK 6的生命周期异常的长。 Java 6 在银行等体系使用比较多可能有以下几个原因:
稳定性高:Java 6 是一个相对成熟和稳定的版本,由于经过多年的实践和测试,已被广泛认可并得到了验证,符合金融行业对稳定性的要求。虽然 Java 7 和 Java 8 等新版本带来了更多的功能和优化,但这些功能并不是每个银行都需要,而且新版本的稳定性也需要一定时间的验证和检验。
可控性强:银行等体系对软件的可控性要求非常高,需要确保软件能够稳定运行,并具备良好的可维护性。在这个方面,Java 6 较新的特性和更新也相对较少,使其相对容易维护和掌控。
成本考虑:对于一些大型机构,升级到最新的 Java 版本可能需要付出巨大的成本。例如,需要修改现有的代码和应用程序、重新测试和审计等。另外,许多旧系统都还在运行 Java 6,升级到新版本需要重新评估风险和效益,这也需要额外的成本和投入。
总之,Java 6 在银行等体系中使用较多是由于其稳定性、可控性和成本方面的考虑。然而,随着时间的推移和新版本的推出,银行等体系也需要逐步升级到更先进的 Java 版本,以满足业务的需求和提高运行效率。
此外,虽然 Java 7 和 Java 8 带来了更多的新特性和优化,但是在银行等体系中升级到新版本需要付出巨大的成本,例如重新编写和测试代码、重新评估安全性等,这也是银行等企业将 Java 6 作为开发平台的一大原因。
◦JDK 7 (2011-7):
引入了switch语句的字符串表达式形式、二进制字面量和下划线数字表示法、Try with Resources语句等特性。
在JDK 7开发期间,Sun公司相继在技术竞争和商业竞争中陷入泥潭,公司的股票 市值跌至仅有高峰时期的3%,已无力推动JDK 7的研发工作按计划继续进行。为了尽快结束JDK 7长期跳票的问题,Oracle收购Sun公司后随即宣布马上实行“B计划”,大幅裁剪了JDK 7预定目标,以保证 JDK 7的正式版能够于2011年7月28日准时发布。
◦JDK 8LST (2014-3):
◦引入了Lambda表达式、Stream API、Date/Time API、接口默认方法、方法引用、重复注解、Optional 类、Nashorn JavaScript 引擎等特性。
这是Java SE中最重要的版本之一,引入了Lambda表达式、Stream API、Default方法、DateTime API等新功能,极大地提高了Java程序的编写效率和开发效率。 原定于2013年9月发布,最终还是跳票到了2014年3月18日,从JDK 8开始,Oracle启用JEP(JDK Enhancement Proposals)来定义和管理纳入新版JDK发布范围的功能特性。
◦JDK 9 (2017-9):
◦引入了模块化系统、JShell、HTTP/2客户端和服务器端API等特性。
发版节奏变更:以后JDK将会在每年的3月和9月各发布一个大版本、每6个JDK大版本中才会被划出一个长期支持(Long Term Support,LTS)版,只有LTS版的JDK能够获得为期3年的支持和更新,JDK 8和JDK 11会是LTS版。 再下一个就到2021年发布的JDK 17 了。
◦JDK 10 (2018-3):
引入了局部变量类型推断、改进了Javadoc等特性。
2018年3月27日,Android的Java侵权案有了最终判决,法庭裁定Google赔偿Oracle合计88亿美元,要知道2009年Oracle收购Sun也就只花了74亿,收购完成后随即就用Sun的专利把Google告上了法庭,经过Oracle法务部的几轮神操作,一场官司的赔偿让收购Sun公司等同免费。
◦JDK 11LST (2018-9):
引入了HTTP Client API(HTTP 客户端API)、Nest-Based Access Control(基于嵌套的访问控制)、Flight Recorder(飞行记录器)、Epsilon GC(Epsilon垃圾回收器)改进的ZGC(Z Garbage Collector)等特性。
这是Java SE中长期支持版本中最新的一个版本,引入了HTTP客户端、Local-Variable Syntax for Lambda Parameters、ZGC等新功能,具有重要的实用价值。 2018年10月,最后一届JavaOne2018在旧金山举行,这个1996年伴随Java一同诞生、成长的开发者年度盛会落下帷幕。此外Java Mission Control(Java Mission Control (JMC)是一个由 Oracle 公司开发的用于监视、管理和分析 Java 应用程序的工具。)开发团队也于6月被Oracle解散。
◦JDK 12(2019年3月):
引入了Switch表达式预览功能、微基准测试套件等特性。
2019年2月,在JDK 12发布前夕,Oracle果然如之前宣布那样在六个月之后就放弃了对上一个版本OpenJDK的维护,RedHat同时从Oracle手上接过OpenJDK 8和OpenJDK 11的管理权利和维护职责。
◦JDK 13(2019年9月):
引入了文本块预览功能、动态CDS归档等特性。
◦JDK 14LST(2020年3月):
引入了实例模式匹配预览功能、非易失性内存支持等特性。
◦JDK 15(2020年9月):
引入了密封类预览功能、Edwards-Curve数字签名算法等特性。
◦JDK 16(2021年3月):
引入了记录类预览功能、向量API等特性。
◦JDK 17LST(2021年9月):
长期支持版本,引入了模式匹配、密封类等正式特性。
◦JDK 18(2022年3月):
引入简单的web服务器、支持在Java API文档中加入代码片段、制定UTF-8作为Java API的默认字符集。
◦JDK 19 (2022年9月):
引入结构化并发的API来简化多线程的编程、支持虚拟线程等。
◦JDK 20LST (2023年3月):
引入记录模式、Switch模式匹配等。
3.当前市面JDK版本使用情况
New Relic近日发布了一份《2023 年 Java 生态系统状况报告》,这份报告收集了上百万份线上的应用程序的数据,统计了目前生产环境中使用最多的JDK版本,最受欢迎的JDK供应商以及容器等的相关数据。
目前市面上有超过56%的应用程序使用了JDK 11,而相比之下,Java 8 的使用从2020年的84%降低到了现在的32%左右,大部分公司在这三年之间都升级到了JDK 11 或者 JDK 17这两个LTS版本上面。
在JDK 的厂商上面,Amazon这两年的增长量是比较大的,从22%上升到了31%,是目前市面上的各个JDK厂商中占比最高的。
4.总结
ok,以上就是截止目前所有的JDK版本及有关特性的简要介绍,原本对各个版本的特性整理了一张脑图,里面有详细的相关介绍,但是这块如果全部都放到文章里面会显得过于冗长,emm,其实目前我们使用的JDK还是JDK8,前段时间通过对JDK的调研还对JDK9中的模块化和JDK19中的虚拟线程进行了学习并使用实际demo对使用场景进行了验证,相关分析会在后续文章进行介绍。
ps:文章末尾附录一张脑图照片~
作者:京东科技 宋慧超
来源:京东云开发者社区 转载请注明出处
聊聊JDK1.0到JDK20的那些事儿的更多相关文章
- 聊聊Android5.0中的水波纹效果
水波纹效果已经不是什么稀罕的东西了,用过5.0新控件的小伙伴都知道这个效果,可是如果使用一个TextView或者Button或者其它普通控件的话,你是否知道如何给它设置水波纹效果呢?OK,我们今天就来 ...
- [转]JDK1.0到12各版本新特性
原文链接 JDK Version 1.0 1996-01-23 Oak(橡树) 初代版本,伟大的一个里程碑,但是是纯解释运行,使用外挂JIT,性能比较差,运行速度慢.JDK Version 1.1 1 ...
- Erda 系列 Meetup「成都站」携手SOFAStack 和你聊聊云原生基础设施建设那点事儿
技术控快上车啦秋天的第一场活动一起来收获技术干货吧! 主题: 云原生基础设施建设的现在及未来时间: 2021 年 9 月 11 日 (周六) 13:30-17:00活动地点: 四川省成都市蚂蚁 C 空 ...
- 聊聊找AI算法岗工作
https://blog.csdn.net/weixin_42137700/article/details/81628028 首先,本文不是为了增加大家的焦虑感,而是站在一名学生的角度聊聊找AI算法岗 ...
- 给jdk写注释系列之jdk1.6容器(10)-Stack&Vector源码解析
前面我们已经接触过几种数据结构了,有数组.链表.Hash表.红黑树(二叉查询树),今天再来看另外一种数据结构:栈. 什么是栈呢,我就不找它具体的定义了,直接举个例子,栈就相当于一个很窄的木桶 ...
- 秒懂OAuth2.0
1.引言 本篇文章是介绍OAuth2.0中最经典最常用的一种授权模式:授权码模式 非常简单的一件事情,网上一堆神乎其神的讲解,让我不得不写一篇文章来终结它们. 一项新的技术,无非就是了解它是什么,为什 ...
- JDK1.8源码(一)——java.lang.Object类
本系列博客将对JDK1.8版本的相关类从源码层次进行介绍,JDK8的下载地址. 首先介绍JDK中所有类的基类——java.lang.Object. Object 类属于 java.lang 包,此包下 ...
- 一张图搞定OAuth2.0
1.引言 本篇文章是介绍OAuth2.0中最经典最常用的一种授权模式:授权码模式 非常简单的一件事情,网上一堆神乎其神的讲解,让我不得不写一篇文章来终结它们. 一项新的技术,无非就是了解它是什么,为什 ...
- centos6.2 下安装并配置hadoop1.0.4(32位安装)
一,环境准备 1. 集群内所有电脑需要设置防火墙,下面以master为例说明: 切换到root用户下,执行setup指令:
- Java 关于集合框架那点事儿
1.引入集合框架 采用数组存在的一些缺陷: 1.数组长度固定不变,不能很好地适应元素数量动态变化的情况. 2.可通过数组名.length获取数组的长度,却无法直接获取数组中真实存储的个数. ...
随机推荐
- 2022-11-16:给你一个数组 nums,我们可以将它按一个非负整数 k 进行轮调, 例如,数组为 nums = [2,4,1,3,0], 我们按 k = 2 进行轮调后,它将变成 [1,3,0,
2022-11-16:给你一个数组 nums,我们可以将它按一个非负整数 k 进行轮调, 例如,数组为 nums = [2,4,1,3,0], 我们按 k = 2 进行轮调后,它将变成 [1,3,0, ...
- 2022-09-22:以下go语言代码输出什么?A:5、B:不能编译;C:运行时死锁。 package main import ( “fmt“ “time“ ) func main
2022-09-22:以下go语言代码输出什么?A:5.B:不能编译:C:运行时死锁. package main import ( "fmt" "time" ) ...
- Python对word文档重排版
介绍 舍友从网上下载的word题库文档很乱,手动改了大半天才改了一点,想起python是大名鼎鼎的自动化脚本,于是乎开始了python对word的一顿瞎操作. 分析需求 对文档中的内容进行分析,只留下 ...
- 巧用OpenSSH进行域内权限维持
最近在Windows服务器上安装OpenSSH,意外发现了一个很有意思的技巧,可用来做域内权限维持,废话不多说,直接上步骤. 01.利用方式 (1)在已经获得权限的Windows服务器上,使用msie ...
- Hugging News #0602: Transformers Agents 介绍、大语言模型排行榜发布!
每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...
- Vue——表单控制、购物车案例、v-model进阶、与后端交互三种方式、箭头函数
表单控制 // 1 checkbox 单选 多选 // 2 radio 单选 <body> <div id="app"> <h1>checkbo ...
- 旧版Vue配置API_ROOT,开发、生产地址切换
1 目录 config/dev.env.js1 'use strict' 2 const merge = require('webpack-merge') 3 const prodEnv = requ ...
- 大家都说Java有三种创建线程的方式!并发编程中的惊天骗局!
在Java中,创建线程是一项非常重要的任务.线程是一种轻量级的子进程,可以并行执行,使得程序的执行效率得到提高.Java提供了多种方式来创建线程,但许多人都认为Java有三种创建线程的方式,它们分别是 ...
- 使用containerd从0搭建k8s(kubernetes)集群
准备环境 准备两台服务器节点,如果需要安装虚拟机,可以参考<wmware和centos安装过程> 机器名 IP 角色 CPU 内存 centos01 192.168.109.130 mas ...
- 无限分解流----Fork/Join框架
Fork译为拆分,Join译为合并Fork/Join框架的思路是把一个非常巨大的任务,拆分成若然的小任务,再由小任务继续拆解.直至达到一个相对合理的任务粒度.然后执行获得结果,然后将这些小任务的结果汇 ...