jvm
首先从计算机原理角度理解jvm
存储指令,并顺序执行指令
可知:
任何程序都应包括
代码段和数据段以及PC寄存器
对应于jvm中
jvm结构
代码段:
方法区 主要存储java的一些方法
数据段:
堆
虚拟机栈
本地方法栈
PC寄存器
程序计数器
虚拟机栈和本地方法栈:
jvm的虚拟机栈和本地方法栈可以类比操作系统的用户栈和内核栈
jvm是c++写的,jdk中内置了一些c++的方法,称为本地方法
调用这些方法,就需要另外的一套栈帧来存储局部数据
堆和栈:
-
堆存放的是全局数据
任何一段代码段都可以访问堆中的数据 -
栈存放的局部数据
局部数据具有随着代码段执行完毕就不再有用需要自动清除的特点所以选择栈来存储
没个函数都具有一个栈帧,函数中的局部变量存在于栈帧中 -
静态局部变量
静态局部变量比较特殊,尽管他只能在函数内被访问,但他的生命周期却不在栈帧内,所以他也是存在堆中
静态变量会随着class对象存在堆中 -
方法区元数据 和 class的区别
class对象存放在堆中
元数据存放在方法区
元数据包括:
public 等修饰符
void 等关键字
class method 等对象都属于元数据
class Main{
static a=1;
final b=1;
public static main(){};
}
从Main.class文件加载后的Main class对象存放在堆中
静态变量a存放在class对象中 也在堆中
常量b存放在方法区的常量池中?
实例化后的Main对象存放在堆中