JVM内存与垃圾回收-3-运行时数据区虚拟机栈总述

JVM内存与垃圾回收-3-运行时数据区虚拟机栈总述,第1张

JVM内存与垃圾回收-3-运行时数据区/虚拟机栈/总述 是什么

虚拟机栈构成
  • 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

答:固定大小的虚拟机栈,线程请求分配的虚拟机栈容量>虚拟机栈允许的最大容量(-Xss大小),抛出StackOverflowError

虚拟机栈的OutOfMemoryError

答:动态大小的虚拟机栈,虚拟机栈扩展-虚拟机栈动态扩展所需容量>内存Available容量,抛出OutOfMemoryError
答:动态大小的虚拟机栈,虚拟机栈新创建-创建新的线程时申请创建对应的虚拟机栈容量>内存Available容量,抛出OutOfMemoryError

总结 虚拟机栈作用
  • 栈管运行(具有跨平台性),堆管存储
  • 虚拟机栈:线程=1:1
  • 虚拟机栈中有多个栈帧,1个栈帧就是1个运行时方法,栈帧中含有(LV,OS,DL,RA,其他附加信息)

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zaji/5671791.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存