栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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,其他附加信息)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/666529.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号