java中的栈和局部变量

上传人:油条 文档编号:13098812 上传时间:2017-10-22 格式:DOCX 页数:4 大小:113.40KB
返回 下载 相关 举报
java中的栈和局部变量_第1页
第1页 / 共4页
java中的栈和局部变量_第2页
第2页 / 共4页
java中的栈和局部变量_第3页
第3页 / 共4页
java中的栈和局部变量_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《java中的栈和局部变量》由会员分享,可在线阅读,更多相关《java中的栈和局部变量(4页珍藏版)》请在金锄头文库上搜索。

1、Java 中的栈:每当启用一个线程时,JVM 就为他分配一个 Java 栈,栈是以帧为单位保存当前线程的运行状态。某个线程正在执行的方法称为当前方法,当前方法使用的栈帧称为当前帧,当前方法所属的类称为当前类,当前类的常量池称为当前常量池。当线程执行一个方法时,它会跟踪当前常量池。每当线程调用一个 Java 方法时,JVM 就会在该线程对应的栈中压入一个帧,这个帧自然就成了当前帧。当执行这个方法时,它使用这个帧来存储参数、局部变量、中间运算结果等等。Java 栈上的所有数据都是私有的。任何线程都不能访问另一个线程的栈数据。所以我们不用考虑多线程情况下栈数据访问同步的情况。像方法区和堆一样,Jav

2、a 栈和帧在内存中也不必是连续的,帧可以分布在连续的栈里,也可以分布在堆里Java 栈的组成元素 栈帧:栈帧由三部分组成:局部变量区、操作数栈、帧数据区。局部变量区和操作数栈的大小要视对应的方法而定,他们是按字长计算的。但调用一个方法时,它从类型信息中得到此方法局部变量区和操作数栈大小,并据此分配栈内存,然后压入 Java 栈。局部变量区 局部变量区被组织为以一个字长为单位、从 0 开始计数的数组,类型为 short、byte 和 char 的值在存入数组前要被转换成 int 值,而 long 和double 在数组中占据连续的两项,在访问局部变量中的 long 或 double 时,只需取出

3、连续两项的第一项的索引值即可,如某个 long 值 在局部变量区中占据的索引时 3、4 项,取值时,指令只需取索引为 3 的 long 值即可。下面就看个例子,好让大家对局部变量区有更深刻的认识。这个图来自深入JVM:public static int runClassMethod(int i,long l,float f,double d,Objecto,byte b) return 0; public int runInstanceMethod(char c,double d,short s,boolean b) return 0; 上面代码片的方法参数和局部变量在局部变量区中的存储结构如

4、下图:上面这个图没什么好说的,大家看看就会懂。但是,在这个图里,有一点需要注意:runInstanceMethod 的局部变量区第一项是个 reference(引用),它指定的就是对象本身的引用,也就是我们常用的 this,但是在 runClassMethod 方法中,没这个引用,那是因为 runClassMethod 是个静态方法。操作数栈和局部变量区一样,操作数栈也被组织成一个以字长为单位的数组。但和前者不同的是,它不是通过索引来访问的,而是通过入栈和出栈来访问的。可把操作数栈理解为存储计算时,临时数据的存储区域。下面我们通过一段简短的程序片段外加一幅图片来了解下操作数栈的作用。int a

5、 = 100;int b = 98;int c = a+b;从图中可以得出:操作数栈其实就是个临时数据存储区域,它是通过入栈和出栈来进行操作的。帧数据区除了局部变量区和操作数栈外,Java 栈帧还需要一些数据来支持常量池解析、正常方法返回以及异常派发机制。这些数据都保存在 Java 栈帧的帧数据区中。当 JVM 执行到需要常量池数据的指令时,它都会通过帧数据区中指向常量池的指针来访问它。除了处理常量池解析外,帧里的数据还要处理 Java 方法的正常结束和异常终止。如果是通过 return 正常结束,则当前栈帧从 Java 栈中弹出,恢复发起调用的方法的栈。如果方法又返回值,JVM 会把返回值压

6、入到发起调用方法的操作数栈。为了处理 Java 方法中的异常情况,帧数据区还必须保存一个对此方法异常引用表的引用。当异常抛出时,JVM 给 catch 块中的代码。如果没发现,方法立即终止,然后 JVM 用帧区数据的信息恢复发起调用的方法的帧。然后再发起调用方法的上下文重新抛出同样的异常。栈的整个结构在前面就描述过:栈是由栈帧组成,每当线程调用一个 Java 方法时,JVM 就会在该线程对应的栈中压入一个帧,而帧是由局部变量区、操作数栈和帧数据区组成。那在一个代码块中,栈到底是什么形式呢?下面是我从深入 JVM中摘抄的一个例子,大家可以看看:代码片段:执行过程中的三个快照:上面所给的图,只想说明两件事情,我们也可用此来理解 Java 中的栈:1、只有在调用一个方法时,才为当前栈分配一个帧,然后将该帧压入栈。2、帧中存储了对应方法的局部数据,方法执行完,对应的帧则从栈中弹出,并把返回结果存储在调用方法的帧的操作数栈中。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号