在高级程序设计语言,如:C和C++中,我们用一种人类可读的格式写程序,然后由一个叫编译器的程序把它翻译成一种二进制格式的可执行代码,这种代码能被机器理解和执行。可执行代码依赖于我们用来执行程序的计算机;它是设备相关的。在Java中,程序的编写和执行的过程是非常相似的,但是有一个重要差别是它允许我们写出设备无关的代码。

  利用一个编译器,所有的Java程序都能被编译成一种叫字节码的中间级代码。我们可以将编译后的字节码运行在任何一台安装了Java运行时环境的计算机上。Java运行时环境由Java虚拟机和它的配套代码组成。

  Java虚拟机是一个模拟设备

  创建Java字节码的一个难点是这些字节码是为一个不存在的设备编译的。这个设备叫做Java虚拟机,它只存在于我们计算机的内存中。让Java编译器为一个不存在的设备创建字节码只是让Java架构变成中性(设备无关)的巧妙过程的一半。Java解释器必须让我们的电脑和字节码文件觉得它们是运行在一个真实的设备上。Java解释器在虚拟机和真实设备之间充当中间人来完成这个任务。(见下图)

图1 – Java虚拟机在一个物理设备上模拟运行

  Java虚拟的负责翻译Java字节码,将其翻译翻译成行为或操作系统调用。例如:一个建立一个远程设备socket连接的请求会包含一个操作系统调用。不同的操作系统用不同的方式处理socket连接,但是程序员并不需要担心这些细节。处理这些翻译是Java虚拟机的任务,所以开发人员完全不必关心运行Java软件的计算机的操作系统和CPU架构的差异。(见下图)

图 2 – Java虚拟机处理(字节码)翻译的过程

  Java虚拟机的基本组成部分

  在我们的电脑内存中创建一个虚拟机需要构造真实计算机没一个主要功能以及程序执行的环境。这些功能可以被分为七大基本部分:

  ● 一系列的寄存器

  ● 一个栈

  ● 一个执行环境

  ● 一个垃圾回收堆

  ● 一个常量池

  ● 一个方法存储区

  ● 一个指令集