2014 年 JDK 8 发布,提供了 Lambda 表达式,并且彻底移除了 HotSpot 的永久代,使用元空间替代。
2017 年 JDK 9 发布,支持 Jigsaw 模块和 Java Shell 等一些新工具,并且 Oracle 宣布每 6 个月发布一个版本,有些版本会被划为长期支持 (LTS) 版,并且只有 LTS 版的 JDK 才能够获得为期 3 年的支持和更新,普通版的 JDK 就只有短短六个月的生命周期。JDK 8、JDK 11 和 JDK 17 属于最近的 LTS 版。
2018 年 3 月 JDK 10 发布,这版本的主要研发目标是内部重构,诸如统一源仓库、统一垃圾收集器接口、统一即时编译器接口。
2018 年 9 月 JDK 11 发布,该版本是一个 TLS 版本,提供了新的 ZGC 垃圾收集器。
2019 年 3 月 JDK 12 发布,改进了 Switch 表达式,并且提供了新的 Shenandoah 垃圾收集器。
2019 年 9 月 JDK 13 发布,继续改进了 Switch 表达式,并且对现有的字符串文本进行了优化,提供了"""xxxx"""这种文本块用法等。
2020 年 3 月 JDK 14 发布,确定了 Switch 表达式,新增了 instanceof 模式匹配和记录类型 (record),并且删除了 CMS 垃圾回收器。
2020 年 9 月 JDK 15 发布,新增了封闭类、隐藏类,并且准备禁用和废除偏向锁,优化了集合,以及标记 ZGC 和 Shenandoah 可以在生产环境使用。
2021 年 3 月 JDK 16 发布,确定了 record 和 instanceof 模式匹配等功能,提供了 jpackage 打包工具,可用于打包独立的 Java 应用程序。
2022 年 9 月 JDK 17 发布,该版本是一个 TLS 版本,增强 TreeMap,弃用 Socket 实现工厂机制,新增 javadoc 工具,统一日志支持异步日志刷新等。
四、Java 虚拟机发展史与种类
我们再看一下 Java 虚拟机的发展史,以及都有哪些比较知名的虚拟机(资料收集于网络):
① Sun Classic VM
1996 年 1 月,Sun 公司发布 JDK 1.0 版本,这时支持 Java 语言运行的就是 Classic VM。
Classic VM 只能使用纯解释执行的方式来运行 Java 代码,执行效率非常差,与传统的 C/C++ 程序执行效率有很大差距,也正是这个时期给大众留下了 "Java 语言很慢" 这种印象。
② Sun Exact VM
在 JDK 1.2 版本时,Sun 团队曾在 Solaris 平台上发布过一款名为 Exact VM 的虚拟机,该虚拟机解决了 Classic VM 中许多的问题,提升了 Java 应用的整体的运行效率。
Exact VM 使用准确式内存管理 (Exact Memory Management) 而得名,该技术实现了虚拟机可以区分内存中某个位置的数据具体是什么类型,减少了每次定位对象间接查找的开销,提升执行性能。并且 Exact VM 执行系统已经具备现代高性能虚拟机的雏形,比如支持两级即时编译器、编译器与解释器混合工作模式等,具备现代高性能虚拟机的维形。
③ Sun HotSpot VM
在 JDK 1.3 版本时,Sun 将默认的虚拟机从 Classic VM 替换为了 HotSpot VM,该虚拟机的使用已经延伸到了现在,也是目前来说使用范围最广的虚拟机。不过,HotSpot VM 在最初并非由 Sun 公司开发,而是由 Longview Technologies 公司设计,Sun 公司注意到了这款虚拟机在 JIT 编译上有许多优秀的理念和实际效果,在 1997 年收购了 Longview Technologies 公司,从而获得了 HotSpot VM。
HotSpot VM 既继承了 Sun 之前两款商用虚拟机的优点,也有许多自己新的技术优势。如热点代码探测技术,可以通过执行计数器找出最具有编译价值的代码,然后通知 JIT 编译器以方法为单位进行编译。
在 2006 年的 JavaOne 大会上,Sun 公司宣布将 Java 进行开源,其中也包括了 HotSpot VM (基于GPL协议),并在此基础上建立了 OpenJDK。不过在 2009 年 Oracle 收购 Sun 公司,并极力的对 HotSpot VM 进行改造,使其性能更优。
当下我们提及 Java 虚拟机时,大多数指的都是 HotSpot 虚拟机,因此深入了解 HotSpot 虚拟机,对我们开发者来说是非常有必要的。
其它虚拟机
除了 Sun 公司以外,其他组织/公司也研发过不少虚拟机的实现,比如:
JRockit: BEA System 公司的 JRockit,BEA 公司后来被 Oracle 公司收购,JRockit 虚拟机也不再继续发展。
OpenJ9: IBM 公司的 J9,后来开源捐献给了 Eclipse 基金会,更名为 OpenJ9。
...
五、Java 虚拟机规范
Java 虚拟机规范根据名字就知道,它是一种 Java 虚拟机实现的规范,也可以说它是一种约定,需要实现 Java 虚拟机的开发者们共同遵守并维护。
简而言之就是说,Java 虚拟机规范约定了 Java 虚拟机中要实现的大致功能,但是 Java 虚拟机规范中并没有规划具体实现的细节,这些实现细节部分将留给开发者们来实现。这就好比我们 Java 开发中的抽象类,抽象类中定义了抽象方法,开发者们只需要实现这些抽象方法就能实现具体的功能。所以,抽象方法的定义者并不关心这些抽象方法实现的细节,只要求实现这些抽象方法即可。
实际上,在 Java 虚拟机规范中规定了虚拟机组成结构、字节码文件结构、虚拟机编译器、加载类的阶段、异常、以及字节码指令集等内容,没有细节和具体功能的描述。
我们只要浏览一遍 Java 虚拟机规范,才能对其内容有所了解,这里给出 Oracle 官网的 Java 虚拟机规范地址,如下:
Oracle Java 虚拟机规范: https://docs.oracle.com/javase/specs/index.html
感兴趣的朋友可以自行查看,相信可以加强你对 Java 虚拟机整体设计的认知。
六、Java 虚拟机语言无关性
在正常情况下,我们肯定会认为 Java 虚拟机是用于运行 Java 语言的,其实这么说并不能说是错误,但是也不完全对,这是因为 Java 虚拟机实际上运行的是特定的二进制字节码文件。实际上 Java 虚拟机和某种语言并没有必然的关联,因为不管什么语言只要能够编译成字节码文件,并符合 Java 虚拟机规范,那么 Java 虚拟机就可以加载该字节码文件,并且执行字节码文件中的指令。
JVM 支持的语言: Clojure、JRuby、Groovy、Scala、JavaScript、Kotlin、...
因此,每种语言只要编译成符合 Java 虚拟机规范的字节码文件,就可以使用 Java 虚拟机运行指定语言的代码。
本文地址:IT问答频道 https://www.eeeoo.cn/itwenda/936272_2.html,嗨游网一个专业手游免费下载攻略知识分享平台,本站部分内容来自网络分享,不对内容负责,如有涉及到您的权益,请联系我们删除,谢谢!