(1) 从软件设计的角度来看,栈代表了处理逻辑,而堆代表了数据,这样分离使得处理逻辑更为清晰,这种隔离、模块化的思想在软件设计的方方面面都有体现
(2) 堆与栈的分离,使得堆中的内容可以被多个栈共享;这种共享有很多好处,一方面提供了一种有效的数据交互方式(如内存共享),另一方面节省了内存空间
(3) 栈因为运行时的需要(如保存系统运行的上下文),需要进行址段的划分;由于栈只能向上增长,因此会限制住栈存储内容的能力,而堆不同,堆的大小可以根据需要动态增长,因此,堆与栈的分离,使得动态增长成为可能,相应栈中只需要记录堆中的一个地址即可
(4) 堆和栈的完美结合就是面向对象的一个实例,其实,面向对象的程序与以前结构化的程序在执行上没有任何区别,但是面向对象的引入使得对待问题的思考方式发生了改变,是更接近于自然的思考方式;当把对象拆开会发现,对象的属性其实就是数据,存放在堆中,而对象的方法就是处理逻辑,存放在栈中,我们编写对象的时候,其实即编写了数据结构,也编写了处理数据的逻辑
(5) jvm 堆存什么,栈中存什么
-
堆中存的是对象,栈中存的是基本数据类型和堆中对象的引用,一个对象的大小是不可估计的,或者说是可以动态变化的,但是在栈中,一个对象只对应了一个 4btye 的引用(堆栈分离的好处)
-
为什么不把基本类型放堆中呢?因为其占用的空间一般是1~8个字节,需要空间比较少,而且因为是基本类型,所以不会出现动态增长的情况:长度固定,因此栈中存储就够了,如果存在堆中没有什么意义,还会浪费空间,可以这么说,基本类型和对象的引用都是存放在栈中,而且都是几个字节的一个数,因此在程序运行时,他们的处理方式是统一的;但是基本类型、对象引用和对象本身就有所区别了,因为一个是栈中的数据一个是堆中的数据,最常见的一个问题就是,Java中参数传递时的问题
总结:栈主要用来执行程序,堆主要用来存放对象,为栈提供数据存储服务,也正是因为堆与栈分离的思想才使得JVM的垃圾回收成为可能
参考地址:zhzihu