前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JVM系列(2),虚拟机栈

JVM系列(2),虚拟机栈

作者头像
小四的技术之旅
发布2022-07-26 08:02:21
1980
发布2022-07-26 08:02:21
举报
文章被收录于专栏:小四的技术文章

栈的介绍

栈也叫栈内存,主管 Java 程序的运行,是在线程创建时创建,它的生命期是跟随线程的生命期,线程结束栈内存也就释放,对于栈来说不存在垃圾回收问题,只要线程一结束该栈就Over,生命周期和线程一致,是线程私有的。8 种基本类型的变量+对象的引用变量+实例方法都是在函数的栈内存中分配。

栈的存储

栈帧中主要保存 3 类数据。

1.本地变量(Local Variables):输入参数和输出参数以及方法内的变量。

2.栈操作(Operand Stack):记录出栈、入栈的操作。

3.栈帧数据(Frame Data):包括类文件、方法等等。

运行原理

栈中的数据都是以栈帧(Stack Frame)的格式存在,栈帧是一个内存区块,是一个数据集,是一个有关方法(Method)和运行期数据的数据集,在java层面,方法如果没有进入JVM叫方法,进了JVM 的栈则叫栈帧。

当一个方法 A被调用时就产生了一个栈帧 F1,并被压入到栈中,A 方法又调用了 B 方法,于是产生栈帧 F2 也被压入栈,B 方法又调用了 C 方法,于是产生栈帧 F3 也被压入栈,执行完毕后,先弹出 F3 栈帧,再弹出 F2 栈帧,再弹出 F1 栈帧。

遵循“先进后出”原则。

每执行一个方法都会产生一个栈帧,保存到栈(后进先出)的顶部,顶部栈就是当前的方法,该方法执行完毕 后会自动将此栈帧出栈。

栈内存溢出

如 果 一 个 线 程 在 计 算 时 所 需 要 用 到 栈 大 小 大于 配 置 允 许 最 大 的 栈 大 小 , 那 么Java 虚 拟 机 将 抛 出StackOverflowError。

栈内存溢出错误:Exception in thread "main" java.lang.StackOverflowError,StackOverflowError不是异常,是错误

编写一个栈堆溢出程序:递归调用方法,当Java栈里面的内存不够用了,就出现错误

栈、堆、方法区的交互关系

我们知道,HotSpot是使用指针的方式来访问对象:Java堆中会存放访问类元数据的地址,reference存储的就直接是对象的地址,比如我创建一个实例Person person = new Person()person是一个引用:存放在Java栈里,new Person()是一个实例:存放在堆里。

如下代码:

代码语言:javascript
复制
package classloader;

public class Test {
    public void changeRef(Person person2) {
        person.setName("steak");
    }public static void main(String[] args) {
        Test test = new Test();
        Person person1 = new Person("刘牌");
        test.changeRef(person1);
        System.out.println(person1);
    }
}


class Person {
    String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                '}';
    }
}

基本类型(八大数据类型)传值,引用类型传内存地址

刚开始person1指向值为刘牌的这个地址,然后main方法调用changeRef(Person person),于是person2又指向同一个地址,但是它的值为steak,所以值就变成steak,虽然是同一个地址,但是值已经不在是以前的那个值。

今天的分享就到这里,感谢你的观看,我们下期见!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-07-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 刘牌 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 栈的介绍
  • 栈的存储
  • 运行原理
  • 栈内存溢出
  • 栈、堆、方法区的交互关系
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档