堆有OOM。
栈也有OOM和SOF
StackOverflowError 栈溢出:
就是不断压栈直到爆了,超过了当前线程的栈内存的实际大小。
栈的OOM:
概念是,如果支持动态扩展,那么这个栈会请求再扩展部分空间。当然内存不是无穷的,如果频繁的扩展内存,以至于无法再继续扩展了,这时候会抛出OutOfMemory异常。
但是!
JVM是没有实现这个功能的,它不支持。
动态扩展就是在栈空间不够的时候,自动加大栈的空间,避免StackOverflow,JVM是没有实现这个功能的。
动态栈通常有两种方法:Segmented stack和Stack copying。
Segmented stack可以简单理解成一个双向链表把多个栈连接起来,一开始只分配一个栈,这个栈的空间不够时,就再分配一个,用链表一个一个连起来。
Stack copying就是在栈不够的时候,分配一个更大的栈,然后把原来的栈复制过去。