没有合适的资源?快使用搜索试试~ 我知道了~
java的堆栈,很详细的资料
5星 · 超过95%的资源 需积分: 50 24 下载量 164 浏览量
2011-05-06
08:52:00
上传
评论
收藏 56KB DOC 举报
温馨提示
试读
11页
java的堆栈java的堆栈java的堆栈java的堆栈java的堆栈java的堆栈java的堆栈
资源推荐
资源详情
资源评论
Java 堆栈
为每个新创建的线程都分配一个堆栈。堆栈以帧为单位保存
线程的状态。 对堆栈只进行两种操作:以帧为单位的压栈和出栈
操作。
某个线程正在执行的方法称为此线程的当前方法。当前方法使用的帧称
为当前帧。当前方法所属的类称为当前类。当前类的常量池称为当前
常量池。当线程执行一个方法时,它会跟踪当前的类和常量池。当
会在当前帧内执行帧内数据的操作。
当线程激活一个 方法, 就会在线程的 堆栈里新压入一个帧。
这个帧自然成为了当前帧。在此方法执行期间,这个帧将用来保存参数,
局部变量,中间计算过程和其他数据。
一个方法可以以两种方法结束。一种是正常返回结束。一种是通过
异常抛出而异常结束。不管以那种方式返回,
都会将当前帧弹出堆栈然后释放掉,这样上一个方法的帧就成为当前帧了。
译者:可能可以这样理解,位于堆栈顶部的帧为当前帧
堆栈上的所有数据都为此线程私有。一个线程不能访问另一个线程
的堆栈数据,所以在多线程的情况下也不需要对堆栈数据的访问进行同步。
象方法区和堆一样见以前的译文, 堆栈和帧在内存中也不必是连续
的。帧可以分布在连续的内存区,也可以不是。帧的数据结构由 的实现者
来决定,他们可以允许用户指定 堆栈的初始大小或最大最小尺寸。
堆栈帧( The Stack Frame)
堆栈帧有三部分:局部变量区,操作数堆栈和帧数据区。局部变量区和操作数堆栈
的大小要视对应的方法而定。编译器在编译的时候就对每个方法进行了计算并放在
了类文件中了。帧数据区的大小对一种 实现来说是一定的。
当 激活一个方法时,它从类信息数据得到此方法的局部变量区和操作数堆栈的
大小,并据此分配大小合适堆栈帧压入 堆栈中。
局部变量区
堆栈帧的局部变量区是一个基为零类型为 的数组。指令通过索引来
使用这些数据。类型为 和 的值在
数组中占据一项,类型为 和 的值在存入数组前都转为了
值而占据一项。类型为 和 的值在数组中占据连续的两项,在
访问他们的时候,指令提供第一项的索引。例如一个 值占据 , 项,指令会
取索引为 的 值。局部变量区的所有值都是字对齐的, 和
的起始索引值没有限定。
局部变量区包含此方法的参数和局部变量。编译器首先以声明的顺序把参数
放入局部数据区。图 !" 显示了下面两个方法的变量区。
##$%&!'$(#)#*)+
*),
---%(
-------$,
-------./
---0
---1(
-------,
-------./
---0
0
图 !"+局部变量区中的方法参数
注意在方法 1(的帧中,第一个参数是一个
类型为 的值,尽管方法没有显示的声明这个参数,但
这是个对每个实例方法都隐含加入的一个
参数值,用来代表调用的对象。译者:与 22中的 指针一样
我们看方法 %(就没有这个变量,这是因为这是一
个类方法,类方法与类相关,而不与对象相关。
我们注意到在源码中的 和 在局部变量区
都成了 。在操作数堆栈也是同样的情况。如前所述, 不直接
支持 类型, 编译器总是用 来表示 。但
对 和 是支持的,这些类型的值可以作为实例变量
存储在局部变量区中,也可以作为类变量存储在方法区中。但在局部变量区
和操作数堆栈中都被转成了 类型的值,期间的运算也是以 来的,
只当存回堆或方法区中,才会转回原来的类型。
同样需要注意的是 %(的对象 。在 中,所以的对象
都以引用传递。所有的对象都存储在堆中,你永远都不会在
局部变量区或操作数堆栈中发现对象的拷贝,只会有对象引用。
编译器对局部变量的放置方法可以多种多样,它可以任意决定放置顺序,
甚至可以用一个索引指代两个局部变量。例如,当两个局部变量的作用域
不重叠时,如 *) 的局部变量 和 。
##$%&!'$(#)#*)+
*),
---3,
-------4./56./22,
-----------7++/
-------0
-------4"/84./!!,
-----------7++/
-------0
---0
0
的实现者对局部变量区的设计仍然有象其他数据区一样的灵活性。
关于 和 数据如何分布在数组中, 规范没有指定。
假如一个 实现的字长为 9 位,可以把 或 数据放在
数组中的低项内,而使高项为空。在字长为 : 位的时候,需要两项
才能放下一个 或 。
操作数堆栈
操作数堆栈象局部变量区一样是用一个类型为 的数组存储数据,
但它不是通过索引来访问的,而是以堆栈的方式压入和弹出。假如
一个指令压入了一个值,另一个指令就可以弹出这个值并使用之。
在操作数堆栈中的处理数据类型的方式和局部变量区是一样的,同样
有数据类型的转换。 没有寄存器, 是基于堆栈的而不是基于寄存器
的,因为 的指令从堆栈中获得操作数,而不是寄存器。虽然操作数还可以
从另外一些地方获得,如字节码中,或常量池内,但主要是从堆栈获得的。
把操作数堆栈当作一个工作区使用。许多指令从此堆栈中弹出数据,进行
运算,然后压入结果。例如, 指令从堆栈中弹出两个数,相加,然后压入
结果。下面显示了 是如何进行这项操作的:
;.---##.
;6---##6
------##
;:--##:
在这个字节码的序列里,前两个指令 ;. 和 ;6 将存储在
局部变量区中索引为 . 和 6 的整数压入操作数据区中,然后相加,将
结果压入操作数据区中。第四条指令 ;: 从操作数据区中弹出
剩余10页未读,继续阅读
资源评论
- ztx_19862014-05-05这个对于了解JAVA具体机制很有帮助。
zc871211
- 粉丝: 1
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- HandTrackingModule.py
- Python基于卷积神经网络的鸟类识别项目源代码,ipynb文件
- 批量将py编译为pyd文件.atbx
- Python项目-学生管理系统
- 图像处理基于matlab图像RGB三色合成分离【含Matlab源码第1发】
- verilog HDL硬件语法设计包括算术运算三人表决器Verilog的阻塞和非阻塞赋值源码例程quartus13.1工程合集
- 【文章话题分类论文】OpenAlex Topic Classification Whitepaper
- linux学习常用命令
- 功率拓扑快速参考指南-ti,TI官方出品
- 开源2023电赛国赛运动目标控制(E题)视觉部分
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功