Java虚拟机是什么

Posted 沙雕程序猿的日常

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java虚拟机是什么相关的知识,希望对你有一定的参考价值。

先,当我们讨论虚拟机的时候,我们讨论的是什么?也就是,我们如何定义一个虚拟机?

虚拟机(Virtual Machine)在维基百科上的定义是:

In computing, a virtual machine (VM) is an emulation of a computer system. Virtual machines are based on computer architectures and provide functionality of a physical computer. Their implementations may involve specialized hardware, software, or a combination.

最关键的一点即虚拟机被认为是计算机系统的一个仿真器(emulator)。或者说,虚拟机被认为是实际计算机系统的一个模拟。

对于一般的开发来说,有时候会希望在Windows操作系统上安装一个Linux系统,或者在macOS上运行一个Windows操作系统。于是我们会安装一个虚拟机,而后在虚拟机里面运行目标操作系统。另外一种场景是,开发人员使用了某种高级开发语言,比如Java。这一类的语言运行在特定的虚拟机之上。

这两种场景其实涉及到了两类虚拟机:

  • 系统虚拟机(System Virtual Machine):这种虚拟机可以看做是计算机系统的一个完整仿真,在其上可以运行不同的操作系统,不同的计算机软件。这种虚拟机往往需要侵入到宿主机的操作系统上,极端的还需要特定的硬件的支持;

  • 进程虚拟机(Process Virtual Machine):这完全就是为了运行一些平台无关程序而诞生的对计算机系统的仿真;

进程虚拟机几乎可以等同于高级语言虚拟机。所谓的高级语言虚拟机,就是用于运行特定的高级语言的虚拟机。比如Java虚拟机。高级语言虚拟机可以从另外一个角度来看待:虚拟机是用一种指令集仿真另一种指令集的系统。

指令集(ISA, Instruction Set Architecture)简单来说就是计算机的一种抽象。这句话很难理解,换一种说法,指令集是软件和硬件之间的接口。比如X86指令集。

回到我们的”虚拟机是用一种指令集仿真另一种指令的系统“。比如说Java。实际上Java语言并没有什么指令集,Java字节码指令是定义在Java虚拟机规范里面的。所以Java虚拟机就是一种用宿主机ISA仿真Java字节码ISA的系统。例如,在X86上,可以将Java虚拟机的实现看成是用X86指令集仿真Java字节码的系统。所以,Java字节码才是Java跨平台的本质原因。任何平台,即便是外星人的计算机,只要它能够遵循Java虚拟机,用它自己的指令集仿真Java字节码指令集,那么Java程序就能在上面运行得很好。

打个比方,我们用中文给孩子讲了一个故事,而后另外一个人,用英文再讲了一遍。中文就是一种”指令集“,而英文就是另一种”指令集“,”讲故事“就是运行一段程序,那个用英文将故事的人,就是扮演了虚拟机的身份。

这里强调的是指令集的仿真。但是为了指令集的仿真这一个核心,就演化出了很多的技术。比如说Java虚拟机的内存管理技术。本质上来说,指令集的仿真并不必然需要一个内存管理模块,更加不是必然需要使用到垃圾回收技术。只是Java虚拟机采用了这种实现指令集仿真的方式而已。再比如HotSpot采用的JIT技术,也并不是必须的。早期的Java虚拟机,完全依赖于解释器,根本没有即时编译这种说法。

所以,指令集的仿真才是Java虚拟机要解决的核心问题。


以上是关于Java虚拟机是什么的主要内容,如果未能解决你的问题,请参考以下文章

[转]Java虚拟机是如何判断变量类型的

什么是Java虚拟机?

java虚拟机工作原理图解

《深入理解Java虚拟机》- Java虚拟机是如何加载Java类的?

03 Java 虚拟机是如何加载 Java 类的

《深度拆解Java虚拟机》之Java虚拟机是如何加载Java类的?