物理地址方面
堆中对象的物理地址分配是不连续的,因此性能较慢于栈,并且在 GC(Garbage Collection)时也需要考虑这些不连续的内存,因此才会需要各种算法,例如:标记-清除、标记-复制、标记-整理等算法。
栈就是使用的数据结构中的栈结构,遵循先进后出的原则,栈的物理地址分配是连续的,所以性能较快。
内存分配方面
堆因为分配的地址不是连续的,所以内存分配需要在运行期间确认,所以分配的内存大小不确定,一般堆大小远远大于栈。
栈分配的地址是连续的,因此分配的内存在编译期间就需要确认,大小是固定的。
存放的内容方面
堆中存放的是对象的实例和数组,该区域只关注数据的存储;
栈中存放的局部变量、操作数栈、动态链接、方法返回地址,该区域更关注程序方法的执行。