JVM-栈

JAVA虚拟机栈

采用栈的数据结构管理方法调用中的基本数据、每一个方法调用使用一个栈帧来保存

虚拟机栈随着线程创建而创建,线程销毁时回收虚拟机栈。

每个线程都有自己的虚拟机栈。

栈帧的组成

每个栈帧分为三个部分
1、局部变量表
2、操作数栈
3、帧数据

1、虚拟机栈->栈帧-> 局部变量表

存放运行过程中所有局部变量

局部变量表是一个数组,数组的每个格子成为(slot),long和double占用2个槽,其他占用1个槽

局部变量表保存的内容有:成员方法的this对象(1个槽),方法参数,方法体里的局部变量。

槽是可以复用的,代码块执行完毕后(某个局部变量不再生效),当前槽就可以被再次使用。

2、虚拟机栈->栈帧-> 操作数栈

存放临时(中间)数据

例如int i = 0; 0先入操作数栈,再从操作数栈取出入局部变量表 int j = i+1; i(0)入栈 1入栈 相加后入局部变量表

3、虚拟机栈->栈帧-> 帧数据

包含动态链接、方法出口、异常表的引用

动态链接:保存编号到内存地址的映射

动态链接

方法出口:存放上一个栈帧中的下一条指令的地址
方法出口

异常表:存放异常处理信息
异常表

虚拟机栈-栈内存溢出 StackOverflowError

1、与-Xss类似,也可以使用 -XX:Threadstacksize 调整标志来配置堆栈大小。
格式为:-XX:ThreadStackSize=1024

2、Hotspot JVM对栈大小的最大值和最小值有要求:
比如测试如下两个参数:
-Xss1k
-Xs51025m
windows(64位)下的JDK8测试最小值为180k,最大值为1024m。

3、局部变量过多、操作数栈深度过大也会影响栈内存的大小。
一般情况下,工作中即便使用了递归进行操作,栈的深度最多也只能到几百,不会出现栈的溢出。
所以此参数可以手动指定为-Xss256k节省内存。

本地方法栈

Java虚拟机栈存储了Java方法调用时的栈帧,而本地方法栈存储的是native本地方法的栈帧。
在Hotspot虚拟机中,Java虚拟机栈和本地方法栈实现上使用了同一个栈空间
本地方法栈会在栈内存上生成一个栈帧,临时保存方法的参数同时方便出现异常时也把本地方法的栈信息打印出来

java.io.FileNotFoundException Create breakpoint : E:\123.txt(设备末就绪。)
at java.io.Fileoutputstream.openo ** (Native Method) **
at java io.File0utputstream.open(File0utputStream.iava:270)
at java.io.File0utputstream.(File0utputstream.java:213
at java io.File0utputstream.(FileOutputstream java:101)
at com,itheima.jvm.chaptero3,NativeDemol,main(NativeDemol.java:18)