在我们学习Java中,总是对内存中的堆栈很模糊。下面总结一下,它们之间的区别。
堆(stack)
- 栈描述的是方法执行的内存模块,每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口)。
- JVM为每个线程创建一个栈,用于存放该线程执行的方法信息(实参 、局部变量)。
- 栈属于线程私有的,不能实现线程的共享。
- 栈的储存特性是:先进后出,后进先出。
- 栈由系统自动分配,运行速度快,是一个连续的内存空间。
堆(heap)
- 堆用于存放储存好的对象和数组,当然数组也是对象。
- JVM只有一个堆,被所有线程共享。
- 堆是一个不连续的内存空间,分配灵活,但速度慢。
方法区(Method area)
方法区其实也在堆里面,只是用于储存类、常量、静态方法和静态变量等相关信息。