堆和栈是JVM中的两个区域,想要知道为什么要搞两个区域,其实只需要搞清楚他们的特点和用途之间区别是什么就行了。
堆是存储对象的区域,堆的大小可以根据需要随时调整,堆的管理有垃圾回收器进行,堆内存是多个线程之间共享的。
栈是每个线程独享的一块区域,用于方法调用、局部变量等的存储。
把这两者区分开的好处有以下几个:
首先因为他们的存储内容不同,可以分开管理。堆内存可以用垃圾回收器管理,栈内存可以靠编译器和虚拟机执行完成。
其次,可以做到不互相影响。独立开两个不同的区域,可以做到不互相影响。堆内存溢出不会影响到栈。栈溢出也不会影响到堆。
还有就是可以做到数据隔离,因为有了栈,就可以把一些线程独享的局部变量等内容放到栈上,可以做到更好的隔离。而共享的一些数据就可以放到堆上做统一管理。
提升各自性能。栈上分配的效率很高,可以适合分配局部变量等,可以非常的高效。而堆上的内存分配及回收都会相对复杂。这样区分开可以做各自的优化,提升整体效率。