JVM(完成度95%,不断更新) (3)

image.png


五、Java虚拟机栈

线程私有
**_栈负责运行、堆负责存储   _ 
栈也叫栈内存,主管Java程序的运行,是在线程创建时创建,它的生命期是跟随线程的生命期,线程结束栈内存也就释放,对于栈来说不存在垃圾回收问题,只要线程一结束该栈就Over,生命周期和线程一致,是线程私有的。8种基本类型的变量+对象的引用变量+实例方法都是在函数的栈内存中分配。 

存储的数据类型

方法==栈帧

方法的本地变量(Local Variables) 输入参数和输出参数以及方法内的变量
栈操作(Operand Stack)   记录出栈、入栈的操作;类似PC寄存器、计数器)  
栈帧数据(Frame Data)   包括类文件(方法里面可以写新的类)、方法等等  

内存结构


栈中的数据都是以栈帧(Stack Frame)的格式存在,栈帧是一个内存区块,是一个数据集,是一个有关方法(Method)和运行期数据的数据集。
每个方法执行的同时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息,每一个方法从调用直至执行完毕的过程,就对应着一个栈帧在虚拟机中入栈到出栈的过程。栈的大小和具体JVM的实现有关,通常在256K~756K之间,约等于1Mb左右。

image.png


”通常就是指这里讲的虚拟机栈,或者更多的情况下只是指虚拟机栈中局部变量表部分。

| 局部变量表 |
局部变量表存放了编译期可知的各种Java虚拟机基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,它并不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或者其他与此对象相关的位置)和returnAddress类型(指向了一条字节码指令的地址)。

这些数据类型在局部变量表中的存储空间以局部变量槽(Slot)来表示。
long、double等64位数据类型占两个变量槽
其余数据类型占一个
局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在栈帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。这里说的“大小”是指变量槽的数量,虚拟机真正使用多大的内存空间(譬如按照1个变量槽占用32个比特、64个比特,或者更多)来实现一个变量槽,这是完全由具体的虚拟机实现自行决定的事情。

操作数栈  
动态链接  
方法出口  

执行顺序

先进后出原则(弹夹)
栈中的数据都是以栈帧(Stack Frame)的格式存在,栈帧是一个内存区块,是一个数据集,是一个有关方法(Method)和运行期数据的数据集,当一个函数1被调用时就产生了一个栈帧 1,并被压入到栈中, 1方法又调用了 2方法,于是产生栈帧 2 也被压入栈, 2方法又调用了 3方法,于是产生栈帧 3 也被压入栈 …… 执行完毕后,先弹出5栈帧,再弹出4栈帧……最后弹出1栈帧……

image.png


image.png


☆堆、栈、方法区的交互关系

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwsdps.html