在Java 虚拟机的规范中定义了一系列的子系统、内存区域、数据类型和使用指南。这些组件构成了Java 虚拟机的内部结构,他们不仅仅为Java 虚拟机的实现提供了清晰的内部结构,更是严格规定了Java 虚拟机实现的外部行为。
每一个Java 虚拟机都由一个类加载器子系统(class loader subsystem ),负责加载程序中的类型(类class 和接口interface ),并赋予唯一的名字。每一个Java 虚拟机都有一个执行引擎 (execution engine )负责执行被加载类中包含的指令。
程序的执行需要一定的内存空间,如字节码、被加载类的其他额外信息、程序中的对象、方法的参数、返回值、本地变量、处理的中间变量等等。Java 虚拟机将 这些信息统统保存在数据区 (data area ) 中。虽然每个Java 虚拟机的实现中都包含数据区,但是Java 虚拟机规范对数据区的规定却非常的抽象。许多结构上的细节部分都留给了 Java 虚拟机实现者自己发挥 。不同Java 虚拟机实现上的内存结构千差万别。一部分实现可能占用很多内存,而其他以下可能只占用很少的内存;一些实现可 能会使用虚拟内存,而其它的则不使用。这种比较精炼的Java 虚拟机内存规约,可以使得Java 虚拟机可以在广泛的平台上被实现。
数据区中的一部分是整个程序共有,其他部分被单独的线程控制。 每一个Java 虚拟机都包含方法区(method area )和堆(heap ) ,他们都被整个程序共享 。Java 虚拟机加载并解析一个类以后,将从类文件中解析出来的信息保存与方法区中。程序执行时创建的 对象都保存在堆中 。
当一个线程被创建时,会被分配只属于它自己的PC 寄存器“pc register” (程序计数器)和Java 堆栈(Java stack ) 。当线程不调用本地方法时,PC 寄存器中保存线程执行的下一条指令。Java 堆栈保存了一个线程调用方法时的状态,包括本地变量、调用方法的 参数、返回值、处理的中间变量。调用本地方法时的状态保存在本地方法堆栈中(native method stacks ),可能再寄存器或者其他非平台独立的内存中 。
Java 堆栈有堆栈块(stack frames (or frames) )组成。堆栈块包含Java 方法调用的状态。当一个线程调用一个方法时,Java 虚拟机会将一个新的块压到Java 堆栈中,当这个方法运行结束时,Java 虚拟机会将对应的块弹出并抛弃。
Java 虚拟机不使用寄存器保存计算的中间结果,而是用Java 堆栈在存放中间结果。这是的Java 虚拟机的指令更紧凑,也更容易在一个没有寄存器的设备上实现Java 虚拟机
JAVA虚拟机的体系结构
最新推荐文章于 2024-09-21 10:38:43 发布