Java虚拟机是什么

2019-02-28  本文已影响0人  flycash

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

虚拟机(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。这一类的语言运行在特定的虚拟机之上。

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

进程虚拟机几乎可以等同于高级语言虚拟机。所谓的高级语言虚拟机,就是用于运行特定的高级语言的虚拟机。比如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虚拟机要解决的核心问题。

上一篇下一篇

猜你喜欢

热点阅读