java中内存分配策略及堆和栈的比较 

内存分配策略

程序运行时的内存分配,程序运行时的内存分配策略主要:静态,栈,堆。

静态存储分配是指在编译时就确定每个数据在运行时存储空间的需求,因而在编译时就可以分配固定的内存空间。这种分配策略要求程序代码中不应许有可变的数据结构(如可变数组),也不应许有嵌套递归出现,因为它会导致编译程序无法正确计算精确的内存空间。

栈存储分配也是动态分配的,和静态分配完全相反,数据区在程序编译时是未知的,直到程序运行运行时才知道,但是规定进入一个程序模块时,必须知道该模块区数据区大小才能分配内存空间,栈式的分配方式是先进后出的原则进行分配。

堆存储分配静态存储分配要求在编译时能知道所有变量的存储要求,栈式存储分配要求在过程的入口处必须知道所有的存储要求,而堆式存储分配则专门负责在编译时或运行时模块入口处都无法确定存储要求的数据结构的内存分配,比如可变长度串和对象实例.堆由大片的可利用块或空闲块组成,堆中的内存可以按照任意顺序分配和释放. 

java中的内存

从堆和栈的功能和作用来通俗的比较,堆主要用来存放对象的,栈主要是用来执行程序的。

java把内存分为:堆内存和栈内存。

在方法中定于的一些基本类型和对象的引用都在方法的栈内存中分配。当定义了一个变量,java栈就会为该变量分配内存空间,当该变量超出作用域后,,Java会自动释放掉为该变量所分配的内存空间,该内存就可以立即另使用。

堆内存:

堆内存主要用来存放new创建的对象和数组。Java的堆内存主要由CG(垃圾回收机制)来管理。

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

引用变量就是为数组和对象起的一个名称,以后就可以在程序中栈中的引用对象来访问堆中的数组和对象。

 

通俗的说:

java 中堆和栈,都是用来存放数据的地方,与C++的不同,java自动管理栈内存和堆内存,程序员不能直接设置栈和堆。

java 堆是一个运行时数据区,类的对象从中分配空间,这些对象通过new 或反射等建立。它们不需要代码来显示的释放空间,由堆的CG来管理,堆的优势是可以动态的分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态的分配内存,交由CG来管理,缺点是由于要在运行时分配内存,所以存取速度较慢。

栈的优势:存取速度比堆快,仅次于寄存器,栈中的数据是可以共享的,栈中就要存放基本数据类型(byte char short  int long float double  boolean)和对象的句柄。