乐趣区

关于java:JVM三运行时数据区

首先: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 在特定平台上保留一个或本机指针。

退出移动版