Java Stack and Heap

本文详细解释了Java中的堆和栈内存概念,包括它们的作用、生命周期及如何存储对象实例、局部变量等内容。通过实例帮助读者更好地理解两者之间的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工作中偶然遇到一个问题,让我想重温一下这个神秘的的领域Java 堆和栈

What is Heap Memory?

     对于大多数引用来说,Java堆(Java Heap)是Java虚拟机管理内存中最大的一块。Java堆是被所有线程共享的一块内存区域在虚拟机启动时创建,此内存区域唯一目的就是存放对象实例,几乎所有对象实例都在这里分配内存。这一点在java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。

                                                                                                                                       --- 引自深入理解java虚拟机

    是不是只是实例对象和数组呢,有没有引用变量存在我们的堆中呢还且继续往下看。

What is Stack Memory?

    栈大家应该多少有些了解它有几个特征如下:

    1.是线程私有的,其生命周期也与线程相同

    2.主要用来存储 局部变量,引用变量,方法信息等

    3.last in first out

下面先举例说明先什么是局部变量和实例变量


从上图我们可以 看出实例变量和局部变量的区别

    1.实例变量在方法外面不在方法里面

    2.局部变量在方面里面不在方法外面

下面再举一个例子来更好的理解上面所说,

比如我们在main方法中调用我们的first方法


它会做些什么呢?

1.首先他会先在栈中创建如下


2.当然我们的变量firstVariable也会在栈中创建


继续往下走我们让我们的first方法再进行调用我们的second


这个时候我们的内存会是怎样的变化呢

1.首先在栈的上方会压入我们的第二个方法


2.紧接着是变量也会加到我们的栈中


继续向下看,使用第二方法调用下面的方法会有什么的结果,



看下图展示:


1.首先我们在Heap上创建我们的对象实例还有实例变量

2.在栈的顶部压入我们的第三个方法,并把引用变量加入栈中

3.栈用引用执行我们在堆中生成的实例对象

当我们的第三个方法调用结束


这是将不会有任何有任何引用指向我们刚才在堆上生成的实例,这是整个实例会被GC回收,

在栈中根据栈的last in first out 原则,在第三个方法调用结束的时候内存也随之释放,

最后第二个方法和第一个方法也随着调用结束从栈中弹出,总的方法在调用处结束这里也就是我们的main方法

以上就是一个简单例子在堆栈中的分配

个人公众号欢迎共同成长交流






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值