描述符: 地址索引为 #19 形参为 java.lang.String 包路径下的 L (引用数据类型) 为 [(数组) String 返回值类型 V(void)
访问标志:[public static]
操作数栈大深度:2 (与数据的类型有关是固定的 32bit的类型占用一个栈单位 64bit的类型占用两个栈单位)
局部变量大槽数: 5 (局部变量的个数,一个局部变量占用栈帧的一个槽位)
字节码长度:表示字节码所占用的行数
比如该类中的 main 占用 25 行
0 bipush 10
2 istore_1
3 ldc2_w #2<20.0>6 dstore_2
7 new #410 dup
11 invokespecial #5: ()V>14 astore 4
16 getstatic #619 ldc #721 invokevirtual #824 return
第一部分:
[0]LineNumberTable
Nr. 表示局部变量的所占槽位置
起始PC 字节码所在行号
行号 在源代码中的行号
第二部分:
[1] LocalVariableTable
Nr. 表示局部变量的所占槽位
起始PC 字节码所在行号 该局部变量的起始作用位置
长度 25 + 0 = 25 (表示整个该方法的整个字节码的长度) 该字节码的结束作用位置
序号 字节码
名字 局部变量
起始PC + 长度 = 局部变量的作用域范围
局部变量的重复利用槽 一个局部变量占用一个槽位
局部变量表实际上在我们的内存结构上是以 数组的形式进行存储的
public class MyStackTest {public void test() {int i = 0;
{int b = 0;
b = i + 1;
}
int c = 0;
c = i + 1;
}
}
可以看到代码块中的变量 b 的起始PC为 4 结束长度为 4 整个作用域的大小为 8
可以看到在本地变量表中,有四个局部变量,分别是内部代码块中的 b , 非静态方法局部变量 this 以及其他两个定义变量 i 与 c ,但是 test 方法的局部变量的大槽数却是 3 也就是说给 test 方法所在栈帧中分配了 3 个局部变量的空间,这与本地局部变量表展现出来的结果出现了歧义。
那么为什么会出现这样的问题呢?
这是因为 内部代码块中代码作用域只是作用与代码块的内部,只是在编译期间起到作用,所以为了节省栈内空间就未给栈帧中局部变量分配槽位。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
当前标题:关于栈的存储结构与运行原理分析-创新互联
文章路径:http://cxhlcq.com/article/gcogj.html