java虚拟机栈是线程运行时所需的存储栈,栈内存储的是栈帧,栈帧包含了本地变量表,操作数栈,动态链接,方法出口。
栈帧
每执行一个方法时,就会给栈中压入一个相对应的栈帧,栈帧的大小是编译期可预测的;当方法执行完后,栈帧弹出。
本地变量表
用于存储方法内局部变量,同时还包含了隐藏的this指针。
操作数栈
jvm指令在执行时,会先将数据压入操作数栈,然后执行
动态链接
执行自身栈帧所对应的方法
方法执行过程
//java 方法
public int add(int i){
int r = i + 1;
return r;
}
//编译后对应的指令
//由方法可得知,总共3个局部变量:[this, i, r]
//只有加法操作,操作数栈的深度为2即可
//从局部变量表中取1号位数据: 参数i的值
//压入到操作数栈中
0: iload_1
//取常量1,压入到操作数栈中
1: iconst_1
//执行加法指令
//加法指令执行成功后,会弹出操作数栈的2个数值, 并压入结果
2: iadd
//将操作数栈中的结果,保存到局部变量2号位:变量r
3: istore_2
//从局部变量表取2号位数据:r,压入操作数栈中
4: iload_2
//返回操作数栈中的值
5: ireturn
优化设置
-Xss 可以设置每个线程的虚拟机栈大小,默认为1M。
若线程栈越大,则jvm能启动的线程数也就越小, 需要根据业务决定。
方法嵌套最大层数 X (本地方发表 + 操作数栈)就可以大概估算需要多少内存。
如果还存在未逃逸的对象,还要加上标量替换的变量大小。