什么是 Java 虚拟机?
一、Java 简介
在介绍虚拟机之前,我们还是简单的回顾一下 Java 的发展故事。
Java 最早是由 SUN 公司的一个小工程师团队在上个世纪 90 年代初开发的一种编程语言,其中詹姆斯·高斯林是项目负责人(人称 Java 之父),编程语言最初被命名为 Oak,以他们的办公室外的橡树而命名,后来因为 Oak 已经被人注册了,因此重新改名成 Java。
在此,我们附上一张 Java 之父的光辉图片!
当时的目标是将其用于开发数字有线电视行业的嵌入式应用程序,例如机顶盒、智能电视等数字设备,实现无障碍的运行。结果推出以后,市场没啥反响。4 年后,技术小组不得不解散。
但也就在此时,互联网刚刚崛起,恰巧这时 MarkArdreesen 开发的 Mosaic 和 Netscape 启发了 Oak 项目组成员,他们利用 Java 编写了 HotJava 浏览器,HotJava 拥有了在页面中运行 Java 代码的能力,可以无障碍的运行在各个电脑设备上,这个效果得到了 Sun 公司首席执行官 ScottMcNealy 的支持,触发了 Java 进军 Internet 的决心。
这在当时引起了不小的轰动,人们从中似乎看到了互联网未来该有的样子,一时间,Java 受到了众多厂商和开发者的追捧。于是趁热打铁,Sun 在 1996 年正式发布了 JDK1.0,当时最主要的十个操作系统厂商宣布,将在它们的系统中支持 Java 程序的运行,从此在互联网高速发展中大杀四方。
Java 之所以能在互联网发展中获得广泛的开发者支持,一个很重要的原因就是它可以实现“一次编写,到处运行”的效果,极大的省去了软件开发工作量,能实现这种效果主要得益于 Java 的架构理念设计。
像 C、C++ 等编程语言,代码是直接编译成机器码执行,虽然很快,但是不同的平台(x86、ARM等) CPU 的指令集也不同,每次开发一个应用程序需要编译出每一种平台的对应机器码,非常麻烦。
Java 则不同,它会将代码编译成一种“字节码”,它类似于抽象的 CPU 指令,然后虚拟机负责加载字节码,根据不同的平台编译成对应的机器码并执行,这样就可以实现了“一次编写,到处运行”的效果。
当然,对于虚拟机,需要针对每个平台分别开发,为了保证不同平台、不同公司开发的虚拟机都能正确执行 Java 字节码,SUN 公司制定了一系列的 Java 虚拟机规范。从实践的角度来看,虚拟机的兼容性做得非常好,低版本的 Java 字节码完全可以正常运行在高版本的虚拟机上。
整个 JDK 内部结构,可以用如下图来概括(图片来自于廖雪峰的Java介绍)
JDK、JRE 和 JVM 三者之间的关系,可以用如下内容来简要描述。
- JDK(Java Development Kit):指的是 Java 语言的软件开发工具包,包括编译器、调试器、Java API 类库、Java 虚拟机等内容,通常用于开发环境
- JRE(Java Runtime Environment):指的是 Java 运行时环境,包括 Java API 类库、Java 虚拟机等内容,通常用于运行 Java 应用程序,通常用于生产环境
- JVM(Java Virtual Machine):指的是 Java 虚拟机,用于在不同的平台上执行 Java 应用程序
可以清晰的看到,JVM 是 Java 应用程序能实现跨平台运行的核心。因此,了解和学习 JVM 相关的知识,有助于开发者对 Java 相关技术有着更全面的认识。
在操作系统的命令行,输入java -version
,即可看到当前 JDK 采用的是哪种版本的虚拟机。
二、虚拟机简介
说起 Java 虚拟机,许多开发者可能首先会想到 HotSpot 虚拟机,正如上文的截图部分。
实际上 Java 虚拟机除了 HotSpot 之外,还有 Sun Classic VM、Exact VM、BEA JRockit VM、IBM J9 VM等等,虚拟机的发展过程,可以用百花齐放这四个字来概括。
2.1、Sun Classic VM
在 1996 年,Sun 发布 JDK 1.0 时,其中自带的虚拟机就是 Classic VM。这款虚拟机使用的是纯解释器的方式来执行 Java 代码,简单的说就是边解释边运行代码,并非像现在这样通过编译器的方式来执行代码(先编译、后执行)。在 Sun Classic 虚拟机中,解释器与编译器无法共同存在,因此 Java 应用程序执行速度上肯定快不起来,只能说够用。
在 1998 年,Sun 在发布 JDK 1.2 时,同时也公布了一款名为 Exact VM 的虚拟机,这款虚拟机尝试解决了 Classic VM 遇到的所有问题。它的执行系统解决了 Classic VM 存在的解释器和编译器无法同时工作的问题,同时还具备了一些现代高性能处理器的特性,如:两级即时编译、准确式内存管理等。
但可惜的是,这款虚拟机一直没有真正被大规模使用过,此时 Sun Classic VM 依然作为默认的 Java 虚拟机。
2.2、HotSpot VM
在 2000 年,Sun 在发布 JDK 1.3 时,公布将 HotSpot VM 作为默认的 Java 虚拟机,也就是大家广为流传的 Java 虚拟机。
实际上,这个虚拟机并不是由 Sun 公司原生开发的,而是由一个叫 Longview Technologies 公司开发的,Sun 公司注意到了这款虚拟机在 JIT 编译上的许多优秀成果,于 1997 年收购了 Longview Technologies 公司,从而获得了 HotSpot VM 的所有权。
HotSpot VM 不仅仅有前面说到两款虚拟机的优点,也有许多自己的新技术,例如:热点探测技术。热点探测技术指的是通过执行计数器找出最具优化价值的代码,然后通知 JIT 编译器以方法为单位进行深度优化编译。
其实 Exact VM 中也有类似的技术,但最终还是选择了 HotSpot 作为默认的虚拟机。
HotSpot VM 作为默认的 Java 虚拟机之后,直到现在,依然是我们最常用的虚拟机,可见 HotSpot VM 的生命力之顽强!
2.3、BEA JRockit / IBM J9 VM
前面说的是 Sun 公司研发的虚拟机,但除了 Sun 公司之外,其他组织、公司也研发过不少的虚拟机实现,其中最著名的就是 BEA 公司的 JRockit VM 和 IBM 公司的 J9 VM 了。
JRockit VM 是除 HotSpot 之外另一款响当当的虚拟机,BEA 公司在 2002 年收购的了此虚拟机的开发商。这款虚拟机在相当一段时间里获称世界上速度最快的 Java 虚拟机,它是一款专注于服务器端应用的虚拟机,并且它的垃圾收集算法相比其它所有虚拟机表现更佳;此外,其提供的 MissionControl 服务套件也十分强大。
IBM 公司的 J9 VM 则是一款比较通用的虚拟机,其定位应用于从服务端到桌面应用,再到嵌入式的多用途虚拟机。IBM 公司开发 J9 VM 的目的是将其作为 IBM 公司各种 Java 产品的执行平台。稍有不同的是,IBM J9 VM 都只能跟 IBM 产品一起使用,虽然不存在技术限制,但是需要单独的商业许可证。
J9 VM 的性能水平大致跟 HotSpot VM 是一个档次的,在一些场景下,有时 HotSpot VM 快些,有时 J9 VM 快些。
2.4、其它 JVM
HotSpot、JRockit 和 J9 这三个虚拟机,曾经在很长的时间并称三大主流 JVM,可以说是 Java 虚拟机发展史上比较耀眼的部分。除此之外,其实还有各种各样的小范围使用的虚拟机。
例如 Azul VM 和 BEA Liquid VM 的专用商业虚拟机,性能非常强悍,可以管理至少数十个 CPU 和数百 GB 的内存资源,还提供在巨大内存范围内实现可控 GC 时间的垃圾收集器等等,这些虚拟机只运行在特定硬件平台,因此要求也比较高。
此外还有许许多多其他的虚拟机存在,例如:Apache Harmony、Google Android Dalvik VM、Mircosoft JVM 等等,都在各自领域发挥作用。
2.5、Oralce
谁都没想到 Sun 公司技术如此的强大,却在之后的岁月里逐渐走向陨落,因为不懂销售和运营,导致公司财务逐渐出现亏损,在 2009 年,Oracle 公司以现金方式收购 Sun 公司,交易价格达 74 亿美元。
此前,Oracle 公司在 2008 年收购了 BEA 公司,获得了 JRocket VM 的所有权;这意味着 JRockit 与 HotSpot 同属于 Oracle 所有。
实际上,现在 JDK1.8 的 HotSpot VM 已经是以前的 HotSpot VM 与 JRockit VM 的合并版,也就是传说中的“HotRockit”,只是产品里名字还是叫 HotSpot VM。
后续的 JVM 发展,相信会越来越好,我们拭目以待!
三、小结
本文主要围绕 Java 的发展历史,对虚拟机的诞生历史做了一次知识总结,在后续的文章中,我们会对 JVM 相关知识进行总结和分享,欢迎大家持续关注!
四、参考
https://www.liaoxuefeng.com/wiki/1252599548343744/1255876875896416
https://www.cnblogs.com/chanshuyi/p/jvm_serial_02_the_history_of_jvm.html
作者:潘志的技术笔记
出处:http://pzblog.cn/
版权归作者所有,转载请注明出处