Java虚拟机内存布局

1、程序计数器:存放当前执行指令的地址。

2、虚拟机栈:描述的是Java方法执行的内存模型。每个方法在执行时都会创建一个栈帧来存储局部变量表,操作数栈,动态链接和方法出口等信息。

局部变量表:存放编译期间可知的各种局部变量,包括基本数据类型和其引用类型。局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,其对应的帧中对局部变量表分配的大小完全确定,在运行期间不会改变。

操作数栈:方法执行中进行算术运算或是调用其他方法进行多参数传递的时候是通过操作数栈进行的。在概念模型中,两个栈帧是相互独立的。但是大多数虚拟机的实现都会进行优化,令两个栈帧出现一部分重叠,令下面的部分操作数栈与上面的局部变量表重叠在一起,这样在方法调用的时候可以共用一部分数据,无需进行额外的参数复制传递。

动态链接:指向运行时常量池的引用。在方法执行中可能会用类中的常量,所以必须有引用指向运行时常量池。

方法出口:方法的返回地址,方法返回之前调用它的位置。

虚拟机栈时线程私有的,它的生命周期与线程相同。

3、本地方法栈:本地方法栈与虚拟机栈实现类似,只不过本地方法栈存放与native方法有关的数据,而虚拟机栈存放与Java方法有关的数据。

4、Java堆:是线程共享的一块内存区域,在JVM启动时创建,所有对象实例和数组都要在堆上分配,是垃圾回收器管理的主要区域。

5、方法区:各个线程共享的内存区域,存储已被虚拟机加载的类信息、常量、静态变量,即时编译器编译后的代码等数据。

运行时常量池是方法区的一部分,它是每一个类或接口的常量池的运行时表示形式,存放编译期间生成的各种字面量,符号引用,在类加载后进入方法区的运行时常量池储存。 
运行时常量池相对于普通class文件的常量池的另一个特性是动态性,java并不要求常量只有编译期间产生,并非Class文件常量池中的常量才可以进入运行时常量池,运行期间也可将新的常量放入池中,例如String 类的intern()方法。

猜你喜欢

转载自blog.csdn.net/strawqqhat/article/details/89198361
今日推荐