JVM · 单选题 · 第 30 题
Java 后端开发面试 · 第 30 题
程序抛出 StackOverflowError,最常见的原因是?
- A递归调用层次过深,或递归没有正确的终止条件
- B堆里存活的对象太多,总大小超过了 -Xmx 设置的上限
- C加载的类太多,把元空间的内存占满了
- DNIO 申请的直接内存超过了限制大小
答案
A A. 递归调用层次过深,或递归没有正确的终止条件
解析
每次方法调用都会压入一个栈帧,递归过深会耗尽线程栈的空间(由 -Xss 设置)。堆满会抛 OutOfMemoryError: Java heap space,元空间满会抛 OutOfMemoryError: Metaspace,直接内存不足会抛 OutOfMemoryError: Direct buffer memory。排查时看异常栈里反复出现的那几帧。