没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
栈帧是⽤于⽀持虚拟机进⾏⽅法调⽤和⽅法执⾏的数据结构,是虚拟机运⾏时数
据区中的虚拟机栈的栈元素。栈帧存储了⽅法的局部变量表,操作数栈,动态链
接以及⽅法返回地址等信息。每⼀个⽅法的调⽤开始到结束都对应着⼀个栈帧在
虚拟机栈⾥从⼊栈到出栈的过程。每⼀个栈帧都包括了局部变量表,操作数栈,
动态链接,⽅法返回地址和⼀些额外的附加信息。在编译程序代码的时候,栈帧
中需要多⼤的局部变量表,多深的操作数栈都已经完全确定了并写⼊到⽅法表的
Code属性中。因此⼀个栈帧需要分配多少内存,不是受程序运⾏期变量数据决
定,⽽是仅仅取决于具体的虚拟机实现。
⼀个线程中的⽅法调⽤链可能会很⻓,很多⽅法都同时处于执⾏状态。对于执⾏
引擎来说,在活动线程中,只有位于栈顶的栈帧才是有效的,称为当前栈帧
1.局部变量表
局部变量表是⼀组变量的存储空间,⽤于存放⽅法参数和⽅法内部定义的局部表
变量,在Java编程成class⽂件时,就在⽅法的Code属性中的max_locals数据项
中定义了该⽅法需要分配局部变量表的最⼤容量。
局部变量表的容量已变量槽(Slot)为最⼩单位,⽽且虚拟机中没有决定Slot的
内存占⽤⼤⼩,只是说每个Slot都应该能存放⼀个boolean, byte, char, int ,
short, float, reference或者returnAddress类型的数据,这8中数据类型,都可以
使⽤32位或者更⼩的物理内存来存放,但这种描述明确的指出每个Slot占⽤32位
⻓度的内存空间有些差别,允许slot的⻓度随着处理器,操作系统或虚拟机的不
同⽽存在变化。对于reference类型,虚拟机并没有明确指出这种引⽤应有的结
构和⻓度,但是⼀般来说,虚拟机实现⾄少都应该通过这种引⽤做到两点,⼀是
从此引⽤中直接或者间接地查找到对象在Java堆中的数据存放的起始地址索引。
⽽是此引⽤中直接或间接地查找到对象所属数据类型在⽅法区中的存储类型信
息。⽽ReturnAddress类型⽬前已经很少⻅了,指向了⼀条字节码指令地址。对
于64位的数据类型,虚拟机会使⽤⾼位对其的⽅式为其分配两个连续的Slot空
间。java语⾔中明确规定reference类型可能是32位可能是64位,⽽64位的数据
只有long和double两种,这⾥的做法就是把long和double类型的数据分割为两次
32为读写的做法。不过由于局部变量表建⽴在成的堆栈上,是线程私有的数据,
⽆论读写两个连续的slot是否是原⼦操作,都不会引起数据安全问题。在⽅法执
⾏的时候,虚拟机是使⽤局部变量表完成参数变量列表的传递过程,如果执⾏的
是实例⽅法(⾮static),那局部变量表中的第0位索引的slot默认是⽤于传递⽅法
所属实例的引⽤,即通过关键字this来访问到这个隐含参数,其余的参数则按照
赵小杏儿
- 粉丝: 19
- 资源: 314
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0