欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java 运行时数据区

程序员文章站 2022-03-20 22:17:17
...

Java虚拟机在执行程序时定义了多个运行时数据区。一些数据区域在虚拟机启动时被创建,在虚拟机退出时被销毁。另外一些数据区归属每个线程,这些数据区伴随线程的生命周期。

1、程序计数器(PC Register)

Jvm支持多线程同时执行,每个虚拟机线程都有自己的程序计数器。在任何一个点,虚拟机线程运行在代码的单一方法中,即该线程的当前方法。如果该方法不是本地方法(native,程序计数器包含JVM当前执行指令的地址,如果是本地方法,程序计数器的值不被定义。

2、虚拟机栈(JVM Stacks)

每个虚拟机线程有一个私有的虚拟机栈,同线程一起创建,用于存放帧(frame)。类似于C语言的栈:保存本地变量与部分结果以及作为方法调用返回的一部分。

栈的大小可以是固定值也可以是动态扩展,固定值在栈创建时设置。

3、堆(Heap)

堆是被虚拟机线程所共享,内存在该区域为类实例及数组分配空间。堆在虚拟机启动时创建,堆中对象被gc回收;对象永远不会显式地释放。

4、方法区(Method Area)

方法区被虚拟机线程所共享,类似于传统语言被编译代码的存储区,或者类似于操作系统进程的“text”段。存储类结构比如运行常量池、方法数据、方法及构造器代码,包括类中的特殊方法和实例及接口的初始化。

方法区在虚拟机启动时创建,方法区虽然属于堆的一部分,但一般实现不会对它进行回收或压缩。

5、运行时常量池(Run-Time Constant Pool)

运行时常量池是类或接口对类中常量池(constant_pool)的运行描述,从方法区分配,运行时常量池在类或接口创建时被构造。

6、本地方法栈(Native Method Stack)

虚拟机对普通栈的一种实现,可以称为“C Stack”,用于支持native方法,本地方法栈也可以用于一种语言(比如C)java虚拟机指令集编译器的实现。