线上出现 StackOverflowError 或 Metaspace OOM,这两类问题你会分别怎么定位?
我的判断
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 的引用链找谁阻止回收。
止损可以适当扩容或重启实例,但修复分别是消除递归/控制深度,以及释放类加载器相关引用、复用生成类。