JVM系列(一) -浅谈虚拟机的成长史

jvm · 浏览次数 : 0

正文

一、摘要

众所周知,Java 经过多年的发展,已经从一门单纯的计算机编程语言,发展成了一套成熟的软件解决方案。从互联网到企业平台,Java 是目前使用最广泛的编程语言。

以下这段内容是来自 Java 的官方介绍!

从笔记本电脑到数据中心,从游戏控制台到科学超级计算机,从手机到互联网,Java 无处不在!

无论是是互联网公司还是传统的企业,在研发数字化平台系统时,世界上绝大部分的公司基本上都会首选采用 Java 来开发,以助力企业的数字化转型和生产效率的提升,原因就不多说了,安全、稳定、高性能、跨平台等等,其实还有一个很大的优势:好招人,哈哈哈~~

而 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等等,虚拟机的发展过程,可以用百花齐放这四个字来概括。

3.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 虚拟机。

3.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 的生命力之顽强!

3.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 快些。

3.4、其它 JVM

HotSpot、JRockit 和 J9 这三个虚拟机,曾经在很长的时间并称三大主流 JVM,可以说是 Java 虚拟机发展史上比较耀眼的部分。除此之外,其实还有各种各样的小范围使用的虚拟机。

例如 Azul VM 和 BEA Liquid VM 的专用商业虚拟机,性能非常强悍,可以管理至少数十个 CPU 和数百 GB 的内存资源,还提供在巨大内存范围内实现可控 GC 时间的垃圾收集器等等,这些虚拟机只运行在特定硬件平台,因此要求也比较高。

此外还有许许多多其他的虚拟机存在,例如:Apache Harmony、Google Android Dalvik VM、Mircosoft JVM 等等,都在各自领域发挥作用。

3.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 相关知识进行总结和分享,如果有描述不对的地方,欢迎大家留言指出,不胜感激!

五、参考

1.https://www.liaoxuefeng.com/wiki/1252599548343744/1255876875896416

2.https://www.cnblogs.com/xrq730/p/4826691.html

3.https://www.cnblogs.com/chanshuyi/p/jvm_serial_02_the_history_of_jvm.html

与JVM系列(一) -浅谈虚拟机的成长史相似的内容:

[转帖]JVM系列之:关于即时编译器的那些事

本文为《深入学习 JVM 系列》第十六篇文章 我们在前文学习 Java 是如何执行的这篇文章中有提及即时编译器,这是一项用来提升应用程序运行效率的技术。通常而言,代码会先被 Java 虚拟机解释执行,之后反复执行的热点代码则会被即时编译成为机器码,直接运行在底层硬件之上。 那么问题来了,既然在 Ho

[转帖]JVM系列之:你知道Java有多少种内存溢出吗

本文为《深入学习 JVM 系列》第二十五篇文章 Java内存区域 关于这部分内容大多来源于《深入理解Java虚拟机》一书。 Java 运行时数据区域(JDK8)如下图所示: 关于上述提到的线程共享和线程隔离区域,下图做详细讲解: 程序计数器 程序计数器是一块较小的内存空间,可以看作是当前线程所执行的

万字详解JVM,让你一文吃透

摘要:本文将带大家详细地了解关于JVM的一些知识点。 本文分享自华为云社区《【JVM】关于JVM,你需要掌握这些 | 一文彻底吃透JVM系列》,作者: 冰 河 。 JDK 是什么? JDK 是用于支持 Java 程序开发的最小环境。 Java 程序设计语言 Java 虚拟机 Java API类库 J

[转帖]JVM 系列 - 内存区域

一、对象在JVM中的表示: OOP-Klass模型 https://www.jianshu.com/p/424a920771a3 写的很赞。 注意:OOP-Klass是hotspot的JVM实现原理,其他JVM的实现可能不一样。、 OOP表示java实例,Klass表示class。 Klass: 包

[转帖]JVM系列之:深入学习方法内联

在前面多篇文章中多次提到方法内联,作为编译器最重要的优化技术,该技术不仅可以消除调用本身带来的性能开销,还能够触发更多的优化。本文将带领大家对该技术一探究竟。 方法内联 方法内联指的是:在编译过程中遇到方法调用时,将目标方法的方法体纳入编译范围之中,并取代原方法调用的优化手段。 以 getter/s

[转帖]JVM系列之:深入学习方法内联

https://zhuanlan.zhihu.com/p/487044559 在前面多篇文章中多次提到方法内联,作为编译器最重要的优化技术,该技术不仅可以消除调用本身带来的性能开销,还能够触发更多的优化。本文将带领大家对该技术一探究竟。 方法内联 方法内联指的是:在编译过程中遇到方法调用时,将目标方

[转帖]Kafka 核心技术与实战学习笔记(六)kafka线上集群部署方案

一.操作系统-Linux Kafka是JVM系的大数据框架kafka由Scala语言和Java语言编写而成,编译之后的源代码就是普通的".class"文件 使用Linux kafka客户端底层使用Java的selector,selector在Linux上的实现机制是epoll,由于在windows上

[转帖]JVM系列之:关于逃逸分析的学习

本文为《深入学习 JVM 系列》第十九篇文章 上文讲解完方法内联后,JIT 即时编译还有一个最前沿的优化技术:逃逸分析(Escape Analysis) 。废话少说,我们直接步入正题吧。 逃逸分析 首先我们需要知道,逃逸分析并不是直接的优化手段,而是通过动态分析对象的作用域,为其它优化手段提供依据的

[转帖]JVM系列之:GC调优基础以及初识jstat命令

本文为《深入学习 JVM 系列》第二十二篇文章 影响垃圾收集性能有三个主要的属性,垃圾收集调优又有三个基本原则,以及垃圾收集调优时需要采集的信息。如果想要对垃圾收集进行调优,则需要根据实际场景对不同属性做出取舍,理解调优的原则以及收集什么信息。 性能属性 吞吐量 吞吐量是评价垃圾收集器能力的重要指标

[转帖]【JVM系列JKD8】参数参考表

JVM是Java底层核心要素,可以说Java生态的东西都是运行在JVM里面的。From:https://docs.oracle.com/javase/8/docs/ JVM参数的含义 JVM参数说明 参数名称含义默认值-Xms初始堆大小物理内存的1/64(<1GB)默认(MinHeapFreeRat