为什么区分堆内存和栈内存

(1) 从软件设计的角度来看,栈代表了处理逻辑,而堆代表了数据,这样分离使得处理逻辑更为清晰,这种隔离、模块化的思想在软件设计的方方面面都有体现


(2) 堆与栈的分离,使得堆中的内容可以被多个栈共享;这种共享有很多好处,一方面提供了一种有效的数据交互方式(如内存共享),另一方面节省了内存空间


(3) 栈因为运行时的需要(如保存系统运行的上下文),需要进行址段的划分;由于栈只能向上增长,因此会限制住栈存储内容的能力,而堆不同,堆的大小可以根据需要动态增长,因此,堆与栈的分离,使得动态增长成为可能,相应栈中只需要记录堆中的一个地址即可


(4) 堆和栈的完美结合就是面向对象的一个实例,其实,面向对象的程序与以前结构化的程序在执行上没有任何区别,但是面向对象的引入使得对待问题的思考方式发生了改变,是更接近于自然的思考方式;当把对象拆开会发现,对象的属性其实就是数据,存放在堆中,而对象的方法就是处理逻辑,存放在栈中,我们编写对象的时候,其实即编写了数据结构,也编写了处理数据的逻辑


(5) jvm 堆存什么,栈中存什么

  • 堆中存的是对象,栈中存的是基本数据类型和堆中对象的引用,一个对象的大小是不可估计的,或者说是可以动态变化的,但是在栈中,一个对象只对应了一个 4btye 的引用(堆栈分离的好处)

  • 为什么不把基本类型放堆中呢?因为其占用的空间一般是1~8个字节,需要空间比较少,而且因为是基本类型,所以不会出现动态增长的情况:长度固定,因此栈中存储就够了,如果存在堆中没有什么意义,还会浪费空间,可以这么说,基本类型和对象的引用都是存放在栈中,而且都是几个字节的一个数,因此在程序运行时,他们的处理方式是统一的;但是基本类型、对象引用和对象本身就有所区别了,因为一个是栈中的数据一个是堆中的数据,最常见的一个问题就是,Java中参数传递时的问题


总结:栈主要用来执行程序,堆主要用来存放对象,为栈提供数据存储服务,也正是因为堆与栈分离的思想才使得JVM的垃圾回收成为可能


参考地址:zhzihu

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tytler

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值