栈是一种先进后出,后进先出的数据结构。
在每一条java线程被创建时,jvm都会为其创建一个线程栈,这个栈是该线程独享的。线程栈里存放的是栈帧。
栈帧也叫方法栈帧,当线程调用到一个方法时,会为这个方法创建一个方法栈帧,并且将这个栈帧压入线程栈中,当调用完这个方法后,该栈帧就会被弹出。
栈帧包括三个部分内容:局部变量区、操作数栈、帧数据区。
局部变量区:当方法栈帧被创建时,jvm会根据当前方法的所有变量类型的大小来创建一个固定的数组,此数组的单位是字长,int、byte、shot、float、byte、boolean、refrence(对象引用)都只占一个字长,而long、double则占二个字长。该数组就是局部变量区的内容,上图
操作数栈:操作数栈是存放操作数的一个临时栈,比如一个方法体里有 int sum = 3+2;这条程序,那操作数栈发生的动作是:1)将操作数2压入操作数栈,2)将操作数3压入操作数栈,3)将3和2弹出并相加,4)将结果5重新压入操作数栈,5)将5弹出并存放到局部变量区中
帧数据区:帧数据区主要用于常量池的解析、异常的处理等,此区暂待研究。
《深入java虚拟机》确实是一本牛B哄哄的书。