栈用来表示程序的运行处理逻辑,而堆用来存储数据。
java中每个线程都有一个独立于其他线程的线程栈,每个线程栈代表了不同的处理逻辑。线程栈大小一般为1M,可根据-Xss参数调整。
堆是程序存储数据(对象)的地方,堆中的数据是共享的,这样的设计一方面便于线程间交互,另一方面堆可以存储一些公共的常量、对象及缓存,节省内存。
java的数据类型可以分为基本类型和引用类型。基本类型因为大小固定,且长度均在1-8个字节,因此存储在栈中。 对象存储在堆中,对象的引用存储在栈中。
java线程栈的大小可以通过-Xss设置,当栈中存储数据比较多时,可适当调大线程栈。java.lang.StackOverflowError异常指示的就是线程栈满了。一般出现这个异常的原因与递归有关。