JVM内存
java程序的执行流程
java源代码(.java文件)由Java编译器编译为class文件,
JVM虚拟机类加载器加载编译后的文件,交给JVM执行引擎去执行
在整个程序执行的过程中,JVM会使用一个名字叫做 Runtime Data Area 运行时数据区来存放程序运行所用到的数据与相关信息
运行时数据区就是我们俗称的JVM内存
根据Java虚拟机规范,运行时数据区分为 程序计数器 本地方法栈 java栈 堆 方法区
程序计数器
用来指示执行那一条指令,每一个线程都有独立的程序计数器,在JVM中多线程是通过线程切换来获取CPU执行时间的.
本地方法栈
: 执行本地方法
java栈(每一个线程都有一个独立的java栈,互不干扰:)
java栈,里边存放的是一个一个的栈帧,每一个栈帧对应一个被调用的方法
在栈帧里包括局部变量表,操作数栈,指向当前方法所在类的运行时常量池的引用,方法的返回地址
局部变量表:就是存放方法中的局部变量(包括在方法声明中的非静态变量以及函数形参).对于基本数据的变量,直接存储的是它的值,对于引用类型变量,存储的是指向对象的引用
局部变量表在编译期就确定大小,程序执行期间,局部变量表大小不改变
指向运行时常量池的引用:在方法执行的过程中,有可能用到类中的常量,所以,需要有一个引用指向运行时常量
方法返回地址:当一个方法执行完,要返回之前调用它的地方
堆:(堆是被所有线程所共享)
java中的堆用来存储对象实例本身以及数组(引用时存放在java栈里边的)
方法区(方法区被所有线程共享):
存放class文件,方法区里存储每个类的信息,包括类的名称,方法信息,字段信息,静态变量,常量以及编译后的代码
常量池是用来存储编译期间生成的字面量和符号引用
运行时常量池,它是每一个类或接口运行时常量池的表示形式,在类和接口被加载到JVM中后,对应的运行时常量池就被创建出来了,
运行时常量池的数据不仅来自于class文件常量池
在运行期间,还可以把新的常量放入运行时常量池