JAVA堆内存和栈内存初步了解

一、堆内存和栈内存

程序运行时内存分配有三种:静态存储分配,栈式存储分配,堆式存储分配

1.静态存储分配:

在程序编译时就可以确定数据目标在运行时所需要的内存,因此在编译时就为其分配固定大小的内存。

这种分配策略不允许代码中有可变数据结构,比如可变数组,嵌套循环结构或者递归,否则无法计算所需要的内存空间。

2.栈式存储分配:

在程序编译时无法计算所需要内存,只有在程序运行时才可以确定数据目标所需要的内存。

要求程序运行到一个模块的入口处,就可以计算该模块数据区所需要的内存空间。

栈内存是由编译器分配和释放的。

3.堆式存储分配:

程序编译时和运行到模块入口处都无法计算分配内存的大小的情况,就需要进行堆式存储分配。

比如可变字符串和对象实例。

堆内存是由程序员向操作系统发出请求进行分配和释放的,由于从操作系统管理的内存分配,所以在分配和销毁时都要占用时间。因此用堆的效率非常低.

但是堆的优点在于,编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间,因此,用堆保存数据时会得到更大的灵活性。

事实上,面向对象的多态性,堆内存分配是必不可少的,因为多态变量所需的存储空间只有在运行时创建了对象之后才能确定.

二、Java中堆内存和栈内存

1.Java中的栈内存:在函数中定义的一些基本数据类型的变量(比如int, short, long, byte, float, double, boolean, char)和对象的引用变量都是在栈内存中分配的

释放:当超过变量的作用域之后,Java就会自动释放掉栈内存,然后另作他用。

2.Java中的堆内存:由new创建的对象和数组都是在堆内存中分配的。 

释放:由Java虚拟机垃圾回收机制进行回收。

在堆中产生一个数组或者对象之后,还可以在栈中定义一个特殊变量,这个变量的取值等于堆内存中的数组或者对象的首地址。栈中的这个变量就成了数组或者对象的引用变量。

posted @ 2017-02-22 16:12  岁月静好--lyr  阅读(178)  评论(0编辑  收藏  举报