Java虚拟机中栈,栈帧,局部变量表的概念和特征。

来源:互联网 发布:网络加速器原理 编辑:程序博客网 时间:2024/05/20 22:13

Java虚拟机栈的特征:

线程私有:

后进先出(LIFO)栈

java虚拟机栈和程序计数器一样,他是线程私有的内存区域,他的生命周期与线程相同,java虚拟机栈描述的是java方法执行时候的内存概念模型,每个方法在执行的时候都会创建一个栈帧,用来创建这个方法的操作数栈,局部变量表,方法出口,动态链接等信息,每一个方法在调用和结束的过程就对应了一个栈帧在虚拟机栈中入栈到出栈的过程,java虚拟机栈是一个后进先出栈,靠后执行的方法会优先完成,后面进入虚拟机栈的栈帧优先被出栈,这与我们平时执行java方法的印象是一致的,在程序执行中java方法的调用,执行和退出,都与java虚拟机栈里面存储的栈帧有着密切的联系。

两种异常:

1.OutOfMemoryError

2.StackOverflowError:如果线程请求的栈深度大于java虚拟机允许的最大深度将会抛出StackOverflowError异常。如果java虚拟机栈被设计成可以动态扩展而动态扩展时又无法申请到足够的内存将会抛出OutOfMemoryError异常。

Java本地方法栈的特征:

本地方法栈和java虚拟机栈十分相似,差别不过是java虚拟机栈是为了java虚拟机执行字节码所服务,而本地方法栈则是为了执行native方法所服务的所以本地方法也是一个私有的内存区域,也是后进先出栈,作用是支撑native方法的调用,执行和退出与java虚拟机栈一样也会出现以上两种异常,可以自己选择实现本地方法栈,有一些虚拟机(如HotSpot)将java虚拟机栈和本地方法栈合并实现。


栈帧的概念和特征:



局部变量表概念和特征:

1:由若干个Slot组成,长度有编译期决定:

局部变量表是一组变量值的存储空间,它用于存储方法,参数,以及方法内部定义的局部变量。在java编译器编译class的时候就在该方法的code属性中确定了该方法所需的最大容量,局部变量表中的变量槽也就是Slot为最小单位,java虚拟机中并没有指明一个Slot所需要占用的内存空间大小,只是非常有导向性的描述到任何一个Slot都应该能存放一个布尔型,字节型,字符型,短整型,整形,浮点型,reference类型以及returnAddress类型的数据在这8种数据类型之中,他们的共同特征是都可以使用32位或者更小的内存空间来进行存放,但Java虚拟机这样描述Slot的空间与明确指出每个Slot应该占用32位内存还是有差别的,他这种描述允许Slot的内存空间随着处理器,操作系统或者java虚拟机的具体实现而发生变化,假如在64位的java虚拟机之中使用了64位的内存空间去实现一个Slotjava虚拟机仍然要使用对齐或者补白的手段,让Slot在外观上看出来了与32位的java虚拟机之中是一致的。


0 0
原创粉丝点击