1. 物理地址
堆的物理地址分配是不连续的,所以性能慢。在GC的时候也要考虑到不连续分配,所以有各种算法。比如,标记清除,复制,标记压缩,分代。
栈的物理地址分配是连续的。所以性能快。
2.内存大小
堆因为是不连续的,所以分配的内存是在运行期确认的,因此大小不固定,堆的大小远大于栈的大小。
栈是连续的,所以分配的内存大小在编译器就确定了,大小是固定的。
3.存放内容
堆存放的是对象的实例和数组。所以堆更关心的是数据的存储。
栈存放的是局部变量,操作数栈,更关心程序方法的执行。
4. 共享性
栈是线程私有的
堆是线程共享的