JVM - 【运行时数据区】栈帧与VMS
VMS:Virtual Mechine Stack(虚拟机栈)
每个线程都会有自己的VMS,VMS本质上是一个栈,栈内部数据类型为“栈帧”;
栈帧:
- 局部变量表(LocalVariablesTable)
- 操作数栈/表达式栈(Operand Stack/Expression Stack)
- 动态链接(Dynamic Linking.)
- 方法返回地址(Method Return Address)
VMS面试题
一:配置VMS大小
JVM - 【HotSpot参数配置】-Xss
二:局部变量表
注意:
每个栈帧(Frame)拥有自己的局部变量表,不同栈帧的局部变量表的数据一般是私有的(特殊情况除外,例如StringBuffer);
package xyz.xx.chapter_string;import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;public class StringTest1 {public static void main(String[] args) {String a = "ABCDEFG";char[] chs = {'A','B','C'};test1(a,chs);System.out.println(a);System.out.println(Arrays.toString(chs));List list = new LinkedList<>();list.add("hello");list.add("world");test2(list);System.out.println(list);int number = 10;test3(number);System.out.println(number);}public static void test1(String str, char[] charArray){str = "hello";System.out.println(str);charArray[0] = '?';}public static void test2(List list){list = new LinkedList();list.add("test2");}public static void test3(int a){a = 99;}
}
运行结果:

结果表明:
- String类型字面量会在堆中StringTable(字符串常量池)中创建新的字符串
- 栈帧中的引用类型一旦指向新开辟的内存空间,所有操作将不再对原内容有影响
↓ ↓ ↓

从编译后的字节码指令可以看出:
byte、short、int、char、boolean在写入操作数栈中都会以int类型的值写入!

bipush
sipush
ldc #N
ldc_2w #N
iload N(从局部变量表中读取值放入操作数栈)
iadd(+)
isub(-)
imul(*)
idiv(/)
irem(%)
istore(将操作数栈顶的数据写入局部变量表)
三:操作数栈
- 存储参与运算的中间变量;
- 存储计算结果;

aload_0(将局部变量表索引为0的引用类型加载到操作数栈=this)
四:动态链接
符号引用 -> 直接引用

编译时期确定下来的常量池(Constant Pool)在程序运行时会被加载到方法区中成为“运行时常量池”:

五:方法返回地址
存放PC寄存器的值:
A方法调用B方法,B方法结束后,程序如何准确返回到A方法调用B的下一行?
方法返回地址就存放了A调用B方法处的下一条指令地址,可以确保方法调用正常进行。
六:VMS面试题

![]()
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!


