Java 中堆与栈的区别
简单的说:
Java把内存划分成两种:一种是栈内存,一种是堆内存。
在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。
当在一段代码块定义一个变量时, Java就在栈中为这个变量分配内存空间, 当超过变量
的作用域后, Java会自动释放掉为该变量所分配的内存空间, 该内存空间可以立即被另作他
用。
堆内存用来存放由 new 创建的对象和数组。
在堆中分配的内存,由 Java虚拟机的自动垃圾回收器来管理。
1. 栈(stack) 与堆 (heap) 都是 Java 用来在 Ram中存放数据的地方。与 C++不同, Java
自动管理栈和堆,程序员不能直接地设置栈或堆。
2. 栈的优势是,存取速度比堆要快,仅次于直接位于 CPU中的寄存器。但缺点是,存
在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享,详见第 3
点。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器, Java 的垃圾收
集器会自动收走这些不再使用的数据。 但缺点是, 由于要在运行时动态分配内存, 存取速度
较慢。
3. Java 中的数据类型有两种。
一种是基本类型 (primitive types), 共有 8 种,即 int, short, long, byte, float,
double, boolean, char( 注意,并没有 string 的基本类型 ) 。这种类型的定义是通过诸如
int a = 3; long b = 255L; 的形式来定义的,称为自动变量。值得注意的是,自动变量存
的是字面值,不是类的实例,即不是类的引用,这里并没有类的存在。如 int a = 3; 这里
的 a 是一个指向 int 类型的引用,指向 3 这个字面值。这些字面值的数据,由于大小可知,
生存期可知 ( 这些字面值固定定义在某个程序块里面, 程序块退出后, 字段值就消失了 ),出