1、概念

栈(Stack):栈是指只能从一边存入和取出数据,是一种先进后出的数据结构。
堆(Heap):堆可以被看作一棵树。

2、空间分配的区别

1、栈:是由操作系统自动分配释放,存放函数的参数值,局部变量的值等。其操作类似于数据结构中的栈。
2、堆:一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式类似于链表。

3、缓存方式的区别

1、栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放;
2、堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

Java中的栈和堆

Java中的常见的内存区域

1、栈内存空间:保存所有对象的引用变量
	2、堆内存空间:保存所有对象的具体内容
	3、全局数据区:保存static类型的变量
	4、全局代码区:保存所有方法的定义

Java中的内存机制

Java中内存分为两种:一种是栈内存,一种是堆内存。在函数中定义的一些基本类型的变量和对象引用变量都是在栈中分配的,当一段代码定义了一个变量时,首先在栈中给这个变量分配空间,当超出这个变量的作用域时,就立即释放掉该变量的内存空间,转而给其他变量使用。
堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由JVM的自动垃圾回收器来管理。在堆中分配了一个对象或者数组之后,在栈中可以生成一个变量,存放该对象或数组的首地址,战中的这个变量就是这个对象或数组的引用变量。当到达引用变量的作用域之外时,战中的变量会被立即释放,但堆的对象或数组不会,当堆中的对象或数组没有引用变量存在时,它就会变成垃圾,却仍然占据着内存,在随后的一个时间点被垃圾回收器释放掉。这也导致了Java比较占内存。