JVM架构
在 Java 虚拟机规范中,虚拟机实例的行为是根据子系统、内存区域、数据类型和指令来描述的。这些组件描述了抽象 Java 虚拟机的抽象内部架构。
当 Java 虚拟机运行程序时,它需要内存来存储许多东西,包括从加载的类文件中提取的字节码和其他信息、程序实例化的对象、方法的参数、返回值、局部变量和计算的中间结果。 Java 虚拟机将执行程序所需的内存组织成几个运行时数据区域。
一些运行时数据区域在应用程序的所有线程之间共享,而另一些则是单个线程私有的。 Java 虚拟机的每个实例都有一个方法区和一个堆。这些区域由在虚拟机内运行的所有线程共享。当虚拟机加载一个类文件时,它会从类文件中包含的二进制数据中解析出一个类型的信息。它将此类型信息放入方法区域。当程序运行时,虚拟机将程序实例化的所有对象放到堆上。
随着每个新线程的出现,它都有自己的 pc 寄存器(程序计数器)和 Java 栈。如果线程正在执行 Java 方法(不是本地方法),则 pc 寄存器的值指示要执行的下一条指令。线程的 Java 栈存储线程的 Java(非本地)方法调用的状态。 Java 方法调用的状态包括它的局部变量、调用它的参数、它的返回值(如果有的话)和中间计算。本地方法调用的状态存储在本地方法栈中,也可能存储在寄存器或其他依赖于实现的内存区域中。
Java 栈由栈帧(或帧)组成。栈帧包含一个 Java 方法调用的状态。当一个线程调用一个方法时,Java 虚拟机将一个新帧推送到该线程的 Java 栈上。当方法完成时,虚拟机弹出并丢弃该方法的帧。