java 栈帧结构_深入理解java虚拟机-运行时栈帧结构

栈帧是什么?

用于支持虚拟机进行方法调用和方法执行的数据结构.

栈帧都存储了些什么东东?

每一个栈帧都包括方法的局部变量表,操作栈,动态连接和方法返回地址和一些附加信息等.

线程,栈帧,方法之间的关系?

一个线程包括多个栈帧,在活动的线程中,栈顶的栈帧为当前栈帧,与该栈帧相关联的方法为当前方法.

局部变量表是什么?

是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量.

局部变量表空间是如何分配的?

局部变量表容量以Slot为最小单位,一个Slot可以存放一个32位以内的数据类型.在Java程序编译为Class文件时,在方法的Code属性的max_locals数据项中确定了该方法所需要分配局部变量表的最大容量.

Slot存储的8种数据类型都是哪些?

boolean,byte,char,short,int,float,reference,returnAddress.

reference类型表示什么?虚拟机可以通过reference类型做什么?

reference表示对一个对象实例的引用.可以通过reference类型做到两点

从引用中直接或间接的查找到对象在java堆中的数据存放的起始地址索引.

从引用中直接或间接的查找到对象在方法区中存储的类型信息.

一个Slot可以存放一个32位以内的数据类型,那对于64位的数据类型该如何处理?

虚拟机会以高位对齐的方式为其分配两个连续的Slot空间.

局部变量表中的Slot是否可重用?重用有哪些优缺点?

Slot是可以重用的,如果当前字节码PC计数器值超出某变量的作用域,那这个变量对应的slot就可以交给其他变量使用.

优点是可以节省一定的栈帧空间.

缺点是在某些情况下Slot复用会影响到GC的行为.如

第一次执行

void x(){

byte[] b=new byte[65535];

System.gc();

}

此时因为变量b还在作用域之内,所以GC并未回收b占有的内存.

第二次执行

void x(){

byte[] b=new byte[65535];

}

System.gc();

此时的占有的内存仍然没有被回收.因为在第一次修改时,代码虽然已经离开了b的作用域,但此后并没有任何对局部变量表的读写操作,b所占有的Slot还没有被其他变量所复用,所以GC Roots一部分的局部变量仍然保持的对它的关联.

第三次执行

void x(){

byte[] b=new byte[65535];

b=null;

}

System.gc();

此时GC正常回收b占有的内存.但经过JIT编译优化后,b=null的代码可以省略,GC可以正确回收掉内存.

什么是操作栈?

后入先出结构,最大深度在编译的时候写入到Code属性的max_stacks数据项中.其中的每一个元素可以是任意java数据类型.

32位占用的栈容量为1, 64位占用的为2.

操作栈的使用过程和用途?

在方法的执行过程中,会有各种字节码指令往操作栈中写入和提取内容,也就是 出栈/入栈 操作.

通常用做算数运算和调用其他方法时用来进行参数传递.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值