栈帧是什么?
用于支持虚拟机进行方法调用和方法执行的数据结构.
栈帧都存储了些什么东东?
每一个栈帧都包括方法的局部变量表,操作栈,动态连接和方法返回地址和一些附加信息等.
线程,栈帧,方法之间的关系?
一个线程包括多个栈帧,在活动的线程中,栈顶的栈帧为当前栈帧,与该栈帧相关联的方法为当前方法.
局部变量表是什么?
是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量.
局部变量表空间是如何分配的?
局部变量表容量以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.
操作栈的使用过程和用途?
在方法的执行过程中,会有各种字节码指令往操作栈中写入和提取内容,也就是 出栈/入栈 操作.
通常用做算数运算和调用其他方法时用来进行参数传递.