堆和栈都是内存的一部分,有着不同的作用。所有的Java程序都是在JVM虚拟机内部运行。
各司其职
最主要的区别就是栈内存用来存储局部变量和方法调用。
而堆内存用来存储Java中的对象,无论是成员变量还是局部变量,类变量,它们指向的对象都存储在堆内存中。
独有还是共享
堆内存属于单个线程,每个线程都会有一个栈内存,其存储的变量只能在其所属线程中可见,即栈内存可以理解成线程的私有内存。
而堆内存的对象堆所有线程可见。堆内存中的对象可以被所有线程访问。
异常错误
如果栈内存没有可用的空间存储方法调用和局部变量,JVM会抛出java.lang.stackoverflowerror.
而如果堆内存没有可用的空间内存生成的对象,JVM会抛出java.lang.outofmemoryerror.
空间大小
栈内存要远远小于堆内存,如果你使用递归的话,那么你的栈很快就会充满。如果递归没有及时跳出,很可能发生stackoverflowerror问题。
你可以通过-Xss选项设置栈内存的大小