JVM在运行java程序时,将它们划分成几种不同的数据,分别存储在不同的区域。但是这些数据统称为(Runtime Data)。
JVM规范中运行时数据分为6种:
1.PC寄存器数据(程序计数器)
PC寄存器是一种数据结构,用于保存当前正常运行的程序内存地址,用于保存被中断的线程的现场。
2.Java栈
JAVA栈总是和线程关联在一起,每创建一个线程的时候,JVM都会为这个线程创建一个对应的JAVA栈,在这个栈中的每个栈帧则又是对应一个个方法,每个栈帧则会包含内部变量(方法的局部变量),操作栈和方法返回值等信息。
每执行完一个方法,这个栈帧就会弹出栈帧的元素作为这个方法的返回值,并且清除这个栈帧,栈顶的栈帧就是当前的活动栈。(PC寄存器指向的地址--->java栈的栈顶)栈帧的返回值则会被添加到操作栈中成为一个操作数,即得到如果是一个没有返回值的栈帧的则不会对操作栈的操作数有影响。
3. 堆
堆是存储java对象的地方。每一个储存在堆中的Java对象都会是这个对象的类的一个副本,它会继承自它父类的所有非静态属性。
4.方法区(所谓的永久区)
被虚拟机加载的类信息、常量、静态常量等。 在JDK8中永久区被移除,取而代之的是元数据区-MetaSpace。
5.本地方法栈
本地方法栈是JVM运行Native方法准备的空间,它和前面介绍的Java栈的作用是类似的。
Native方法的底层是C++编写的。
6.运行时常量池
是方法区的一部分。存储着每个class文件中的常量表,属于方法区的一部分。
补充:方法区,本地方法栈,运行时常量池 都在堆中进行分配
网友评论