Java 虚拟机
Java 虚拟机使得 Java 的平台无关性成为可能。一般的高级语言必须将程序编译成与平台相对应的目标代码,对于不同的平台需要编译成不同的目标代码。而 Java 只需将 Java 程序编译成 Java 字节码,然后在虚拟机上完成从字节码到机器指令的转换。
注意: ** Java 虚拟机是 Java 程序的底层基础,在学习 Java 语言之前对 Java 虚拟机有一个大体了解,有助于理解 Java 语言的一些特性,也有助于学习 Java程序设计知识
。**
Java 虚拟机支持的 Java 语言的基本数据类型如下。
- byte:1 字节。
- short:2 字节。
- int:4 字节。
- long:8 字节。
- float:4 字节。
- double:8 字节。
- char:2 字节。
Java 虚拟机并没有给 boolean 类型指定单独的操作指令,boolean 类型数据用 Integer 指令完成,boolean 类型数组由 byte 数组处理。
注意:在 Java 中,数组被作为对象引用来处理。
Java 虚拟机的生命周期
Java 虚拟机具有明确的生命周期:当执行 Java 程序时,Java 虚拟机就开始运行;当程序结束时,Java 虚拟机也就停止运行。同一台计算机每多执行一个 Java 程序,就会多运行一个 Java 虚拟机。**Java 虚拟机从 Java 程序的 main() 方法开始执行这个程序,main() 方法被称为 Java 程序的主方法。**该方法是共有的、返回类型为 void 、参数为一个字符串数组的方法。main() 方法是程序运行的起点,被执行的程序初始化为程序初始化线程,程序内部的其他线程都是由它启动的。
Java虚拟机的体系结构
Java 虚拟机由 5 部分组成:方法区、堆、Java 栈、寄存器和指令集。这 5 部分从逻辑上对 Java 虚拟机进行划分,它虽然不依据具体的实现技术,但在功能上必须符合要求,如下图所示:
1.指令集
Java 虚拟机大约有 248 个字节码,每个字节码用来执行一种基本的 CPU 运算。Java 指令集等同于 Java程序的汇编语言。
2.寄存器
Java 虚拟机的寄存器用来保存运行状态,它与微处理器的专用寄存器相似。Java 虚拟机的寄存器包括以下 4 种。
- pc: 计数器。
- optop: 操作数栈顶指针。
- frame: 指向当前执行方法所在环境的指针。
- vars: 指向当前执行方法使用的局部变量中的第一个变量指针。
3. Java 栈
Java 虚拟机是栈结构,Java 栈是 Java 虚拟机存储信息的主要方式。当 Java 虚拟机得到一个 Java 字节码的应用程序后,就会为该程序的每一个类的每一个方法创建一个栈区域,用于保存方法的状态信息。Java 虚拟机的栈区域有 3 种:局部变量区、运行环境区和操作数区。
- 局部变量区 用于保存这个类的所有方法用到的局部变量。而 vars 寄存器指向局部变量区域的变量表的第一个局部变量。
- 运行环境区 用于存储解释器对 Java 字节码解释时需要的信息。这些信息包括上次调用方法、局部变量指针、操作数栈的栈顶和栈底指针。
- 操作数区 用于存储运算所需的操作数及运算的结果。
4. 堆
Java 类的实例对象所需的空间被分配到堆上,解释器负责为类实例对象分配空间。当解释器为一个类实例对象分配空间之后,便对该实例内存空间的使用进行记录,如果对象已经使用完毕,则将它回收到堆中。
在 Java 语言中,使用 new 语句完成对 Java 对象的内存分配,而具体对内存的释放完全由 Java 系统自己完成。Java 系统的设计者也可以设计自己的垃圾回收方法。在 Sun 公司开发的 Java 解释器和 Hot Java 环境中,垃圾回收由后台线程完成。这种垃圾回收方式不但提高了系统的运行效率,而且预防了程序员操作内存带来的风险。
5. 方法区
Java 方法区用于存储 Java 方法的字节码。对于方法区的具体实现方式并没有在 Java 虚拟机规范中规定,这样 Java 应用程序方法区的布局便可在运行过程中确定,因此对平台具有依赖性。