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

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

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

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

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