本文重点
在前面的课程中,我们学习了运行时数据区的大概情况,从本文开始,我们将对一些组件进行详细的介绍,本文我们将学习栈。栈内存主管java的运行,是在线程创建时创建的,它是线程私有的,它的生命周期是跟随线程的生命期,也就是说线程结束栈内存就释放了,对于栈来说不存在垃圾回收的问题。
栈的结构
每个线程都会包含一个栈区,每个栈又包含了若干个栈帧,每次方法调用的时候就会从上加入一个栈帧,一个栈帧中存储一些内容。每个栈帧中都拥有:
局部变量表:主要存放了编译器可知的各种数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,它不同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)。其中64位长度的long 和double类型的数据会占用2个局部变量空间, 其余的数据类型只占用1个。
操作数栈:每个栈帧都包含一个称为操作数栈的后进先出的栈。栈帧刚刚创建的时候,操作数栈是空的。Java虚拟机提供一些字节码指令来从局部变量表或者对象实例的字段中复制常量或者变量到操作数栈中,也提供了一些指令用于从操作数栈取走数据、操作数据以及把操作结果重新入栈。在调用方法时,操作数栈也被用来准备调用方法的参数以及接收方法返回结果。一个long或者double类型的数据会占用两个单位的栈深度,