- JVM进程:虚拟机栈=1:n;线程:虚拟机栈=1:1;虚拟机栈:栈帧=1:n;栈帧:方法=1:1
- 虚拟机栈 栈顶栈帧 就是 当前正在运行的方法
- 栈帧:1个方法的开始执行就是1个栈帧的入帧,1个方法的结束运行就是1个栈帧的出栈
- 栈帧:当前栈帧就是栈顶栈帧
- 栈帧:执行引擎运行的所有字节码指令只 *** 作当前栈帧
- 栈帧:main方法也会作为1个栈帧,所有被调用的方法都会成为栈帧
- 栈帧:含有LV(Local Variable Table)-局部变量表,OS(Operation Stack)- *** 作数栈,RA(Return Adress)-返回地址,DL(Dynamic link)-动态链接,一些附加信息
- Java本为跨平台而生,传统基于寄存器的指令集架构跨平台性差与硬件耦合度高,基于栈的指令集架构跨平台性高与硬件耦合度很低
- Java为了为了跨平台所以出现了虚拟机栈
- 负责:栈管运行,堆管存储
- 生命周期:虚拟机栈与其所属线程一致
- 内容:基本数据类型的值,引用数据类型的引用,部分运算结果,方法调用形参值,方法返回值
- GC:栈具有先进后出的特性,GC的意义不大
- OOM:
- 方法调用返回时,当前栈帧回传返回值给下1个栈帧
代码
public class VMStack { public static void main(String[] args) { int a = 10; int b = 11; int c = a + b; System.out.println(c); sayHi1(); } // void public static void sayHi1() { System.out.println("Hi, xcrj!"); sayHi2(); } // int public static int sayHi2() { System.out.println("Hi, xcrj!"); sayHi3(); return 0; } // double public static double sayHi3() { // 此处打断点 System.out.println("Hi, xcrj!"); return 0.0; } }
结果
解释
- Debugger/frames是方法调用产生的栈帧
- 栈帧从下到上是依次调用的顺序
- 作用:设置线程可用最大虚拟机栈大小
- -Xss的大小决定了函数调用的最大深度
答:固定大小的虚拟机栈,线程请求分配的虚拟机栈容量>虚拟机栈允许的最大容量(-Xss大小),抛出StackOverflowError
虚拟机栈的OutOfMemoryError答:动态大小的虚拟机栈,虚拟机栈扩展-虚拟机栈动态扩展所需容量>内存Available容量,抛出OutOfMemoryError
答:动态大小的虚拟机栈,虚拟机栈新创建-创建新的线程时申请创建对应的虚拟机栈容量>内存Available容量,抛出OutOfMemoryError
- 栈管运行(具有跨平台性),堆管存储
- 虚拟机栈:线程=1:1
- 虚拟机栈中有多个栈帧,1个栈帧就是1个运行时方法,栈帧中含有(LV,OS,DL,RA,其他附加信息)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)