Java 运行时数据区
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虚拟机指令集编译器的实现。