众所周知,JVM的内存模型分为方法区,堆,栈(虚拟机栈),本地方法栈,程序计数器。其中方法区和堆为线程共享,其余三类为线程私有。大部分的文章都在讲解其作用,但是为什么这么划分却并未涉及,本文从堆栈的职能角度剖析,抛砖引玉,希望能带来启发。
首先从存储方面来理解:
栈存什么?
栈存储的是局部变量表,动态链接,操作数栈,方法出口,等与线程方法相关的信息,总之是为操作逻辑服务。由于每个线程都有自己的逻辑,所以栈是线程私有的。
堆存什么?
堆存储的是实例对象和数组,简而言之是一些基础数据。即为所有方法提供数据支撑,所以是公共区域多线程共享。
这样做有几个好处:
1从软件设计的角度理解,堆栈的划分就是为了将数据与逻辑区分开来。相当于隔离,模块化,这是软件设计中的一个重要的思想。
2堆栈的分离,使得一些多方法多线程可共用的数据只保存一份就可以,不必每次都在私有栈中创建取值,即堆中存放具体数据,栈中存放引用,数据大小不可控,但是一个引用只有4byte,这样既节约了资源又提供了一种有效的数据交互方式。(有一点需要注意,基本类型数据的值是直接保存在栈中的,因为基本类型只有1-8个字节,且不会动态增长,有小有可控所以直接放在栈内方便取用)
3非常好的实现了面向对象的设计思想,面向对象更接近于自然的方式思考,把对象拆分开,其实对象的属性就是数据,一般保存在堆中;而结构及行为就相当于逻辑,存放在栈中。我们在编写代码的时候既编写了栈中的内容