java 堆栈

来源:互联网 发布:延长壳牌西安待遇知乎 编辑:程序博客网 时间:2024/06/06 03:23

java栈   

java栈用来保存线程的运行状态。每当启动一个新线程时,java虚拟机都会为该线程分配一个java栈,并且栈上的所有数据都是此线程私有的(即任何线程都不能访问另一个线程的栈数据)。java栈是由许多栈帧(stack frame)或帧(frame)组成的,一个栈帧包含一个java方法的调用。当线程调用一个java方法时,虚拟机压入一个新的栈帧到该线程的java栈中;而当该方法返回时,这个栈帧被从java栈中弹出并抛弃。

栈帧

栈帧由三部分组成:局部变量区、操作数栈和帧数据区。

局部变量区  包含对应方法的参数和局部变量,它以一个字长为单位,从0开始计数的数组。类型为int、float、reference和returnValue的值在数组中只占据一项,而类型为boolean、byte、short和char的值在存入数组前都被转化为int值因而同样占据一项;但是long和double占据连续的两项。如:
class Example{
   public static int runClassMethod(int i,long l,float f,double d,Object o,byte b){return 0;}
   public int runInstanceMethod(char c,double d,short s,boolean b){return 0;}
}
操作数栈 与局部变量一样,也是以一个字长为单位;但是与前者不同的是,它不是通过索引来访问,而是通过标准的栈操作(push、pop)来访问。如:
iload_0 //push the int in local variable 0
iload_1 //push the int in local variable 1
iadd //pop two ints ,add them ,push result
istore_2//pop int ,store into local variable 2

帧数据区  除了局部变量区和操作数外,java栈还需要一些数据来支持常量池的解析、正常方法返回以及异常派发机制,这些信息都保存在帧数据区中。

0 0
原创粉丝点击