JVM是Java编译器和OS之间的模拟处理器。代码程序面向虚拟机,只需生成虚拟机可以识别的代码,然后由解释器将其转换为特定系统的机器码执行。
JVM提供的方式是操作系统的动态连接库,所以需要有程序路径path,path路径主要是用来寻找到程序运行所需要的类库。
虚拟机可理解的代码叫做字节码。字节码是JVM可以识别和执行的指令,它是一个二进制的类文件。JVM可以算是一个抽象的计算机,它具有一个指令集并可以使用不用的存储区域。它执行指令,还管理着数据、内存和寄存器。每个JVM都有方法区和堆被整个程序共享。JVM在加载和解析一个类之后,会将解析出来的信息保存在方法区中。
JVM的体系机构:寄存器、栈、(废区收集)堆、存储区(方法区域)、指令集。
1、指令集:JVM大概具有大约248个字节码。指令中包含一个单字节的操作符,有0个或多个操作数。许多指令没有操作数,由一个单字节的操作符构成。指令中操作数的数量和大小由操作符决定的。当操作数比一个字节大时,存储顺序是高位字节优先。
2、寄存器:JVM中的寄存器种类有4种:
PC寄存器 |
Java程序计数器 |
optop寄存器 |
指向操作数栈顶的指针 |
frame寄存器 |
指向当前执行方法的执行环境的指针 |
vars寄存器 |
执行当前执行方法中局部变量区的第一个变量的指针 |
寄存器都是32位的,其目的不是为了存储或传递参数,而是为了保证指令集的简洁性和实现时的高效性。
3、栈:局部变量区、运行环境区、操作数区。Java栈保存一个线程调用方法时的状态,包括本地变量、调用方法的参数、返回值、中间变量等等。
局部变量区:长度是32位的。长整型和双精度浮点数占据两个局部变量的空间,但是按第一个局部变量的地址作为索引来寻址。虚拟机提供指令使得局部变量区和操作数区之间的数据传递。
运行环境区:在运行环境中包含的信息作为动态链接、正常方法返回和异常传播。
1)动态链接:包括对指向当前类和当前方法的解释器符号表的指针,用于支持动态链接。方法的.class文件代码在引用要调用的方法和药访问的变量时使用符号。动态链接的作用是把符号形式的方法翻译成实际方法调用。装载必要的类以解释还没有定义的符号,并把变量访问翻译成这些变量运行时的存储结构相对应的偏移地址。
2)正常方法返回:当方法正常结束并执行了一条正确类型的返回指针时,执行环境在正常返回的请况下用于恢复寄存器, 将程序计数器加1,在执行环境中继续执行。
3)异常传播:a.异常动态链接错误,无法找到所需的class文件。b.运行时错误,对一个空指针的引用,每个catch子句包含其有效指令范围,能够处理的异常类型和处理异常的代码地址。
操作数栈区:机器指令只在操作数栈中取操作数,对它们进行操作,并将结果返回到栈中。选择栈结构是因为少量寄存器或非通用寄存器的机器上,能高效地模拟虚拟机的行为。注意:栈是32位的。
4、无用单元收集堆:运行时的数据区,即运行时用来存储类的数据的区域。类的实例从中分配空间。
5、方法区:保存方法代码(编译后的java代码)和符号表。方法代码不包括在无用单元收集堆中。另外,JVM在执行本地方法时,下一条执行指令不保存在PC寄存器中。