• 说起 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 虚拟机的历史相关推荐

  1. 一、了解java虚拟机历史发展、及java8带来的新特性

    1.Jdk8的新特性:     1.Lambda表达式     2.Stream函数式操作流元素集合     3.接口新增:默认方法与静态方法     4.方法引用,与Lambda表达式联合使用    ...

  2. 《深入理解Java虚拟机》(第二版)学习3:垃圾收集器

    垃圾收集器 如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现. 我们这里讨论的收集器主要是基于JDK 1.7 Update 14之后的 Hotspot VM . Serial 收 ...

  3. 《深入理解Java虚拟机》-----第3章 垃圾收集器与内存分配策略

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来. 3.1 概述 说起垃圾收集(Garbage Collection,G ...

  4. Java虚拟机详解(四)------垃圾收集器

    上一篇博客我们介绍了Java虚拟机垃圾回收,介绍了几种常用的垃圾回收算法,包括标记-清除,标记整理,复制等,这些算法我们可以看做是内存回收的理论方法,那么在Java虚拟机中,由谁来具体实现这些方法呢? ...

  5. Java虚拟机垃圾收集器初步学习

    Java虚拟机-垃圾收集器 1.概述 如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现.     这里讨论的收集器基于JDK 1.7 Update 14之后的HotSpot虚拟机 ...

  6. java拆解_深入拆解Java虚拟机视频教程

    目录: 第1节说在前面的话   00:05:07分钟   | 第3节环境搭建以及jdk,jre,jvm的关系   00:20:48分钟   | 第5节jvm再体验-jvm可视化监控工具   00:21 ...

  7. Java虚拟机详解04----GC算法和种类【重要】

    本文主要内容: GC的概念 GC算法  引用计数法(无法解决循环引用的问题,不被java采纳) 根搜索算法 现代虚拟机中的垃圾搜集算法: 标记-清除 复制算法(新生代) 标记-压缩(老年代) 分代收集 ...

  8. Java虚拟机详解01----初识JVM

    主要内容如下: JVM的概念 JVM发展历史 JVM种类 Java语言规范 JVM规范 一.JVM的概念: JVM: Java Virtual Machine,意为Java虚拟机. 虚拟机: 指通过软 ...

  9. 【深入Java虚拟机JVM 06】垃圾收集概述

    说明:文章所有内容均摘自<深入理解Java虚拟机:JVM高级特性与最佳实践(第二版)> 说起垃圾收集(Garbage Collection,GC),大部分人都把这项技术当做Java语言的伴 ...

最新文章

  1. Docker数据卷管理
  2. Xamarin XAML语言教程使用使用Progress属性设置当前进度
  3. opencv 人脸识别 (一)训练样本的处理
  4. onnx模型推理(python)
  5. WPF特效-实现弧形旋转轮播图
  6. RuoYi-Cloud 部署篇_02(windows环境 Oracle +nginx版本)
  7. linux运行欧陆风云,Arm linux启动分析(1)
  8. java对象 引用 原理,java对象引用和对象值得行为
  9. 宋宝华: CPU是如何访问到内存的?--MMU最基本原理
  10. css带三角形的对话框
  11. java数组下标从几开始的_为什么数组角标从0开始
  12. Win10企业版转专业版
  13. TI BSL in python
  14. 基于Android的校园一卡通App平台
  15. C语言中字符数组的初始化与赋值,字符串相关函数
  16. python音乐相册_python爬虫之爬取网易云音乐的歌曲图片和歌词
  17. 微信生日贺卡html5,生日微信贺卡祝福语_经典快乐生日微信祝福语
  18. C/C++黑洞陷阱(Kaprekar问题)
  19. eNSP安装包 百度网盘链接开篇·前言
  20. CSS 中的边框和轮廓属性

热门文章

  1. 苹果天气不显示_手机资讯:苹果设计师藏在 iPhone 中的小惊喜:你发现了几个
  2. 验证码的前世今生(前世篇)
  3. 办公楼租用技巧及出租办公楼注意事项
  4. ELM327中文说明书
  5. python爬虫爬取**单词
  6. PHP获取当前时间戳
  7. 喜欢屯视频的你,一定会喜欢 GitHub 上这几款视频下载神器!
  8. 开创性的区块链操作系统项目——去中心化的战舰游戏
  9. Java面试自我介绍怎么说?Java面试技巧!
  10. QGraphicsView放大和缩小下鼠标位置使用鼠标滚轮