内存模型的架构图
JVM需要去加载Class文件,加载完毕后,执行引擎执行的过程需要将加载的信息存放起来,或者说是这段时间的空间分配和释放过程,这就是运行时数据区: 包括 方法区,堆,栈,本地方法栈,程序计数器(绿色的时线程共享的,蓝色的线程私有的)。
程序计数器(有时候面试会遇到程序计数器为什么时线程私有的,共享不行吗?)
程序计数器是一块比较小的内存空间,代表的就是当前线程所执行字节码行号的指示器,解释器就是根据程序计数器来指向小一条执行字节码的指令来运行程序。 一个处理器只会去处理一个线程中的指令,而再多线程的时候线程进行上下稳文切换的时候,如果不保存当前的程序计数器的值,那么等线程切会的时候就不知道上次执行到了哪里,就又得重新开始执行,这显然是不可取的,所以所,程序计数器是要线程私有的。
栈
一个线程会分配一个栈,生命周期和栈的生命周期是一样的,栈是java方法执行的内存模型,每个线程可能会去执行很多方法,每个方法就对应着一个栈帧,栈帧中包含局部变量表,操作数栈,动态链接,方法出口等信息
局部变量表:
局部变量表就存的是一些基本数据类型,对象的引用等,比如String a = new String("123");对于这句话的分析,a是存在栈中的,而123的内存开销是存在堆中的。
本地方法栈
这个一个是基于java方法的,一个是基于Native方法的,作用是一样的。
java堆
在虚拟机启动的时候就会创建的,存放对象的实例,也是java垃圾回收的重要区域。
方法区
存放整个程序的方法信息什么的