Java 虚拟机的历史
- 说起 Java 虚拟机,许多人就会将其与 HotSpot 虚拟机等同看待。但实际上 Java 虚拟机除了 HotSpot 之外,还有
Sun Classic VM、Exact VM、BEA JRocketit、IBM J9 等等。今天我们就来简单回顾下 Java
虚拟机的发展历史。
虚拟机始祖:Sun Classic
- 在 1996 年 1 月 23 日,Sun 发布 JDK 1.0,其中自带的虚拟机就是 Classic
VM。但这款虚拟机有个特点,即只能使用纯解释器的方式来执行 Java 代码,如果要使用 JIT 编译器那就必须使用外挂。 - tips: 执行代码可以分为编译执行和解释执行。解释执行指的是边解释边运行代码。编译执行指的是先编译,后执行。
- 但如果外挂了 JIT 编译器,那么 JIT 编译器就完全替代了虚拟机的执行系统,解释器便不再工作了。简单地说,在 Sun Classic
虚拟机中,解释器与编译器无法共同存在。 - 而且即使使用了外挂 JIT 编译器,Sun Classic
虚拟机的执行速度也快不起来。因为解释器无法和编译器配合工作,虚拟机无法判断哪个方法是使用频率高,所以它只能对每个方法都进行编译。这就导致了虚拟机只能采取相对简单的优化技术,无法进行耗时稍微较高的优化技术。因为如果对所有代码都采用耗时高的优化技术,那么编译时间会慢得无法接受。 - 虽然 Sun Classic 虚拟机有这样那样的问题,但其生命力还是非常旺盛的。在 JDK 1.3 之前,其一直是 JDK
的默认虚拟机。而在 JDK 1.3 时,HotSpot 成为默认虚拟机,其作为备用虚拟机存在。到了 JDK 1.4
时,其正式退出历史舞台。可以说 Sun Classic 还是存在了将近四年的时间,但另外一个虚拟机可就没有那么好的运气了。
无疾而终:Sun Exact VM
- 在 Sun Classic 发布后,Sun 的虚拟机团队在 JDK 1.2 时 发布了一款名为 Exact VM 的虚拟机,尝试解决
Classic VM 遇到的所有问题。它的执行系统解决了 Classic VM
存在的解释器和编译器无法同时工作的问题,还具备了一些现代高性能处理器的特性,如:两级即时编译等。 - 除此之外,Exact VM 还改进了虚拟机的对象查找方式。在 Classic VM
中,如果要查找一个对象,那么需要通过句柄(类似指针)来查找。如果需要查找一个对象,那么需要通过其构建成的句柄树一层层寻找。但在 Exact
VM 中使用了准确式内存管理(Exact Memory
Management),即虚拟机可以知道内存中某个位置的数据具体是什么类型,这样就减少了查找的的开销,提升执行性能。 - 但可惜的是,虽然 ExactVM 发布了,但一直到它退出时,其都没有真正被大规模使用过。在 JDK 1.2 其发布时,Exact VM
推出,但Sun Classic VM 依然作为默认的 Java 虚拟机。在 JDK 1.3 发布时,推出虚拟机 HotSpot VM
作为默认虚拟机,而 Sun Classic VM 作为备用虚拟机。
武林盟主:Sun HotSpot VM
- HotSpot VM 可以说是使用最为广泛的 Java 虚拟机,几乎所有的 Java 虚拟机都知道它。但实际上,这个虚拟机并不是由 Sun
公司原生开发的,而是由一个叫 Longview Technologies 公司开发的。而 Sun 公司注意到了这款虚拟机在 JIT
编译上的许多优秀成果,于 1997 年收购了 Longview Technologies 公司,从而获得了 HotSpot VM。 - 要说 HotSpot
不仅仅有前面说到两款虚拟机的优点(如:准确式内存管理),也有许多自己的新技术,例如:热点探测技术。热点探测技术指的是通过执行计数器找出最具优化价值的代码,然后通知
JIT 编译器以方法为单位进行深度优化编译。但其实 Exact VM 中也有类似的技术,Sun 公司内部还因此大吵了一架,但最终还是选择了
HotSpot 作为默认的虚拟机,其中的缘由不得而知。 - 总的来说,从 2000 年 JDK 1.3 发布,HotSpot VM 作为默认的虚拟机开始登上历史舞台。到现在 2018 年,18
年时间过去了,其依然是我们最常用的虚拟机,可见 Sun HotSpot VM 的生命力之顽强。
百家争鸣:BEA JRockit / IBM J9 VM
- 前面说的都是 Sun 公司推出的虚拟机,但除了 Sun 公司之外,其他组织、公司也研发过不少的虚拟机实现,其中最著名的要算 BEA 公司的
BEA JRockit 和 IBM 公司的 J9 VM 了。 - BEA 公司的 JRockit
是一款专注于服务器硬件和服务端应用场景的虚拟机,其针对服务端场景做了大量的优化,因此其不太关注程序启动速度。JRockit
虚拟机内部不包含解释器实现,全部代码都靠即时编译器编译后执行。此外,其提供的 MissionControl 服务套件也十分强大。 - IBM 公司的 J9 VM 则是一款比较通用的虚拟机,其定位应用于从服务端到桌面应用再到嵌入式的多用途虚拟机。IBM 公司开发 J9 VM
的目的是将其作为 IBM 公司各种 Java 产品的执行平台。
武林外传:那些无名虚拟机
- 从 Sun Classic、Sun Exact VM、Sun HotSpot VM,再到 BEA JRockit、IBM J9
VM,这几个虚拟机可以说是虚拟机的正史了,是每个 Java 程序员应该了解的。但在这之外,其实还有各种各样的虚拟机存在。 - 例如性能最强悍的并不是上面所说的虚拟机,而是名为 Azul VM 和 BEA Liquid VM
的专用商业及虚拟机。这些虚拟机只运行在特定硬件平台,因此要求比较高。但其性能也是非常强悍的。其可以管理至少数十个 CPU 和数百 GB
的内存资源,还提供在巨大内存范围内实现可控 GC 时间的垃圾收集器等等。 - 此外还有许许多多其他的虚拟机存在,例如:Apache Harmony、Google Android Dalvik VM、Mircosoft
JVM 等等。
最后的赢家:Oracle
看了这么些历史,似乎都是在说 Sun公司发布的虚拟机,与 Oracle 似乎没有什么关系。但在 2010 年,Oracle 公司收购了
Sun 公司,这样 Oracle 就拥有了 HotSpot VM。再加上其在 2008 年收购 BEA 公司获得的 JRocket
VM,Oracle 公司就拥有了地球上最优秀的两款虚拟机。对于虚拟机未来的规划,Oracle 宣布会将 JRockit 的优秀特性整合到 HotSpot VM 中,例如移植 JRockit
的垃圾回收器和 MissionControl 服务。
附录:Java 虚拟机历史
JDK 版本升级不仅仅体现在语言和功能特性上,还包括了其编译和执行的 Java 虚拟机的升级。
1996 年,JDK 1.0 发布时,提供了纯解释执行的 Java 虚拟机实现:Sun Classic VM。
1997 年,JDK 1.1 发布时,虚拟机没有做变更,依然使用 Sun Classic VM 作为默认的虚拟机。
1998 年,JDK 1.2 发布时,提供了运行在 Solaris 平台的 Exact VM 虚拟机,但此时还是用 Sun Classic
VM 作为默认的 Java 虚拟机。2000 年,JDK1.3 发布,默认的 Java 虚拟机由 Sun Classic VM 改为 Sun HotSopt VM,而 Sun
Classic VM 则作为备用虚拟机。2002 年,JDK 1.4 发布,Sun Classic VM 退出商用虚拟机舞台,直接使用 Sun HotSpot VM
作为默认虚拟机一直到现在。
Java 虚拟机的历史相关推荐
- 一、了解java虚拟机历史发展、及java8带来的新特性
1.Jdk8的新特性: 1.Lambda表达式 2.Stream函数式操作流元素集合 3.接口新增:默认方法与静态方法 4.方法引用,与Lambda表达式联合使用 ...
- 《深入理解Java虚拟机》(第二版)学习3:垃圾收集器
垃圾收集器 如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现. 我们这里讨论的收集器主要是基于JDK 1.7 Update 14之后的 Hotspot VM . Serial 收 ...
- 《深入理解Java虚拟机》-----第3章 垃圾收集器与内存分配策略
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来. 3.1 概述 说起垃圾收集(Garbage Collection,G ...
- Java虚拟机详解(四)------垃圾收集器
上一篇博客我们介绍了Java虚拟机垃圾回收,介绍了几种常用的垃圾回收算法,包括标记-清除,标记整理,复制等,这些算法我们可以看做是内存回收的理论方法,那么在Java虚拟机中,由谁来具体实现这些方法呢? ...
- Java虚拟机垃圾收集器初步学习
Java虚拟机-垃圾收集器 1.概述 如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现. 这里讨论的收集器基于JDK 1.7 Update 14之后的HotSpot虚拟机 ...
- java拆解_深入拆解Java虚拟机视频教程
目录: 第1节说在前面的话 00:05:07分钟 | 第3节环境搭建以及jdk,jre,jvm的关系 00:20:48分钟 | 第5节jvm再体验-jvm可视化监控工具 00:21 ...
- Java虚拟机详解04----GC算法和种类【重要】
本文主要内容: GC的概念 GC算法 引用计数法(无法解决循环引用的问题,不被java采纳) 根搜索算法 现代虚拟机中的垃圾搜集算法: 标记-清除 复制算法(新生代) 标记-压缩(老年代) 分代收集 ...
- Java虚拟机详解01----初识JVM
主要内容如下: JVM的概念 JVM发展历史 JVM种类 Java语言规范 JVM规范 一.JVM的概念: JVM: Java Virtual Machine,意为Java虚拟机. 虚拟机: 指通过软 ...
- 【深入Java虚拟机JVM 06】垃圾收集概述
说明:文章所有内容均摘自<深入理解Java虚拟机:JVM高级特性与最佳实践(第二版)> 说起垃圾收集(Garbage Collection,GC),大部分人都把这项技术当做Java语言的伴 ...
最新文章
- Docker数据卷管理
- Xamarin XAML语言教程使用使用Progress属性设置当前进度
- opencv 人脸识别 (一)训练样本的处理
- onnx模型推理(python)
- WPF特效-实现弧形旋转轮播图
- RuoYi-Cloud 部署篇_02(windows环境 Oracle +nginx版本)
- linux运行欧陆风云,Arm linux启动分析(1)
- java对象 引用 原理,java对象引用和对象值得行为
- 宋宝华: CPU是如何访问到内存的?--MMU最基本原理
- css带三角形的对话框
- java数组下标从几开始的_为什么数组角标从0开始
- Win10企业版转专业版
- TI BSL in python
- 基于Android的校园一卡通App平台
- C语言中字符数组的初始化与赋值,字符串相关函数
- python音乐相册_python爬虫之爬取网易云音乐的歌曲图片和歌词
- 微信生日贺卡html5,生日微信贺卡祝福语_经典快乐生日微信祝福语
- C/C++黑洞陷阱(Kaprekar问题)
- eNSP安装包 百度网盘链接开篇·前言
- CSS 中的边框和轮廓属性