虚拟机就像计算机(computer),它模拟包括 CPU 在内的几个硬件组件,能够执行 算术运算、读写内存、与 I/O 设备交互。最重要的是,它能理解机器语言(machine language),因此可以用相应的语言来对它进行编程。
虚拟机的跨平台方式是自己创建一个标准的 CPU 架 构,然后在不同的物理设备上模拟这个 CPU 架构。
Java Virtual Machine (JVM) 就是一个非常成功的例子。JVM 本身是一个中等大小、程序员完全能够看懂的程序,因此很 容易将它移植到包括手机在内的上千种设备上。只要在设备上实现了 JVM,接下来任何 Java、Kotlin 或 Clojure 程序都无需任何修改就可以直接运行在这个设备上。
一个寄存器就是 CPU 上一个能够存储单个数据的槽(slot)。寄存器就像是 CPU 的 “工作台”(workbench),CPU 要对一段数据进行处理,必须先将数据放到某个寄存器中。但 因为寄存器的数量很少,因此在任意时刻只能有很少的数据加载到寄存器。计算机的解决办 法是:首先将数据从内存加载到寄存器,然后将计算结果放到其他寄存器,最后将最终结果 再写回内存。
目前我们见到的大部分的计算机架构都可以把程序当做一张很长的写满指令的纸条,而计算姬要做的就是从头读到尾,并从头执行到尾,我们的虚拟机同样遵循着这样的”执行守则"
JVM
JVM架构
当类加载到JVM时,它会创建一个类类型的对象,并被放入堆区域。这个类类型对象只在类首次加载到JVM时创建。
每个线程都有单独的堆栈区域.堆栈负责保存方法(方法局部变量等),每当我们调用方法时,在堆栈中创建一个新的,方法执行完成时,它们将被销毁。
当程序开始执行时,解释器逐行读取字节代码.这个过程将使用某种字典,它暗示应该将这种字节代码转换成这种机器指令。这个过程的主要优点是解释器非常快速地加载和执行。
为了克服解释器的主要缺点,引入了即时编译器.这意味着jit编译器可以记住代码块,这些代码块会一次又一次地执行。例如,有一个叫做"雇员"的类别getEmployeeID() 方法在这个类中声明。如果程序使用getEmployeeID() 方法1000次,每次由解释器执行。但是jit编译器可以识别那些重复的代码段,它们将作为本地代码存储在缓存中。因为它是存储的,所以下次JIT编译器使用存储在缓存中的本地代码。
Java字节码是Java虚拟机(JVM)的机器语言。JVM将编译的二进制字节代码转换为特定的机器语言。