JJava 知识库
JAVA INTERVIEW

高频面试题

JVM进阶约 2 分钟

线上出现 StackOverflowError 或 Metaspace OOM,这两类问题你会分别怎么定位?

参考回答约 2 分钟 · 口语表达
我的判断

StackOverflowError 看单线程调用栈,Metaspace OOM 看类和类加载器;两者都不能只靠把上限调大。

StackOverflowError 出现时先保留异常线程完整栈。重复的方法通常能直接暴露无限递归、双向 toString/equals 或递归解析;如果只是合法深调用,再结合最大深度评估改迭代还是调整 -Xss。盲目增大 Xss 会让每个线程占更多地址空间。

Metaspace OOM 则看类数量是否持续增长:

jcmd <pid> VM.classloader_stats
jcmd <pid> GC.class_histogram

热部署、脚本引擎、动态代理和插件反复创建 ClassLoader,但旧加载器仍被线程、ThreadLocal、静态集合引用,是常见根因。heap dump 里会沿 ClassLoader 的引用链找谁阻止回收。

止损可以适当扩容或重启实例,但修复分别是消除递归/控制深度,以及释放类加载器相关引用、复用生成类。