首先:Java 虚拟机遵循冯诺依曼计算机模型
运行时数据区
官网地址
1. 运行时数据区
Java 虚拟机定义了在程序执行期间应用的各种运行时数据区域。其中一些数据区域是在 Java 虚拟机启动时创立的(办法区、堆),仅在 Java 虚拟机退出时才被销毁。其余数据区域是每个线程的(虚拟机栈、本地办法栈、程序计数器)。在创立线程时创立每线程数据区域,在线程退出时销毁每个数据区域。
1.1:办法区
Java 虚拟机具备一个在 所有 Java 虚拟机线程之间共享 的办法区
该办法区域相似于惯例语言的 编译代码 的存储区域,或者相似于操作系统过程中的“文本”段。它存储每个类的构造,例如运行时常量池,字段和办法数据,以及办法和构造函数的代码,包含用于类和实例初始化以及接口初始化的非凡办法
办法区域是在虚拟机启动时创立的。只管办法区域在逻辑上是堆的一部分,然而简略的实现能够抉择不进行垃圾回收或压缩。该标准没有规定办法区域的地位或用于治理已编译代码的策略。
办法区域能够是固定大小的,或者能够依据计算的须要进行扩大,如果不须要更大的办法区域,则能够放大。办法区域的内存不用是间断的。
阐明:办法区蕴含常量池,在前言【1.2.2:.class 文件】常量池,外面存储的是符号援用,当程序运行时,就会转换成间接援用,存储在运行时常量池中,即运行时常量池属于办法区
1.2:堆
Java 虚拟机具备一个在 所有 Java 虚拟机线程之间共享 的堆。堆是运行时数据区,从中调配 所有类实例和数组 的内存。
堆是在虚拟机启动时创立的。对象的堆存储由主动存储管理零碎(称为垃圾收集器)回收;对象永远不会显式开释。Java 虚拟机不假设特定类型的主动存储管理零碎,并且能够依据实现者的零碎要求抉择存储管理技术。
堆的大小能够是固定的,也能够依据计算的须要进行扩大,如果不须要更大的堆,则能够将其膨胀。堆的内存不用是间断的。
1.3:Java 虚拟机堆栈
每个 Java 虚拟机线程都有一个公有_Java 虚拟机堆栈_,与该线程同时创立。Java 虚拟机堆栈存储框架。
public static int b(int i1, int i2) {return i1 + i2;}
public static int a(int i1, int i2) {return a(i1, i2);
}
public static void main(String[] args) {System.out.println(a(2, 5));
}
1.4:本机办法堆栈
Java 虚拟机的实现能够应用传统的堆栈(俗称“C 堆栈”)来反对
native
办法(以 Java 编程语言以外的语言编写的办法)。解释程序的实现也能够应用诸如 C 之类的语言为 Java 虚拟机的指令集的解释器的实现应用本机办法栈。无奈加载native
办法并且本身不依赖于惯例堆栈的 Java 虚拟机实现不须要提供本机办法栈。如果提供,通常在创立每个线程时为每个线程调配本机办法堆栈。该标准容许本机办法堆栈具备固定大小,或者依据计算要求动静扩大和膨胀。如果本机办法堆栈的大小固定,则在创立每个本机办法堆栈的大小时能够独立抉择。
1.5:程序计数器
Java 虚拟机能够一次反对多个执行线程。每个 Java 虚拟机线程都有其本人的
pc
寄存器(程序计数器)。在任何时候,每个 Java 虚拟机线程都在执行单个办法的代码,即该线程的以后办法。如果不是
native
,则该pc
寄存器蕴含以后正在执行的 Java 虚拟机指令的地址。如果线程以后正在执行的办法是
native
,则 Java 虚拟机的pc
寄存器值未定义。Java 虚拟机的
pc
寄存器足够宽,能够returnAddress
在特定平台上保留一个或本机指针。