栈是一种逻辑数据结构,是JVM虚拟机中的一块内存区域,栈深度就表示着栈所占内存的大小,深度越大,代表可以执行的方法越多。
栈的深度参考:
https://blog.csdn.net/qq_28385797/article/details/53468665
1)StackOverFlowError:若Java虚拟机栈的内存大小不允许动态扩展,那么当线程请求的栈深度大于虚拟机允许的最大深度时(但内存空间可能还有很多),就抛出此异常
2)OutOfMemoryError:若Java虚拟机栈的内存大小允许动态扩展,且当线程请求栈时内存用完了,无法再动态扩展了,此时抛出OutOfMemoryError异常
动态栈通常有两种方法:Segmented stack和Stack copying。
(1)Segmented stack可以简单理解成一个双向链表把多个栈连接起来,一开始只分配一个栈,这个栈的空间不够时,就再分配一个,用链表一个一个连起来。
(2)Stack copying就是在栈不够的时候,分配一个更大的栈,然后把原来的栈复制过去。
JVM参数设置参考:
https://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html
FULL GC
在通常意义上人们口中说的Full GC
为一次特殊GC行为的描述,这次GC会回收整个堆的内存,包含老年代,新生代,metaspace等
在gc.log中会发现在部分gc日志头中也有Full GC这样的字眼,这里表示的含义是在这次GC的全过程中,都是Stop The world的状态,也就是说在这次GC的全过程中所有用户线程都是处于暂停的状态
查看jvm: