JVM元空间(方法区)和栈内存溢出原因及解决方案

上一篇 << 下一篇 >>>JVM堆内存溢出和内存泄露问题定位和解决
1.元空间(方法区)溢出 1.1 错误现象

java.lang.OutOfMemoryError: Metaspace
1.2 原因
方法区空间已满
1.3 解决方案
调整方法区的配置,参照JVM性能调优的评估指标及调优示例
2.栈内存溢出 2.1错误现象
【JVM元空间(方法区)和栈内存溢出原因及解决方案】java.lang.StackOverflowError
2.2代码演示
public static void count(){ try { count++; count(); } catch (Throwable e) { System.out.println("最大深度:"+count); e.printStackTrace(); } } 执行结果 默认最大深度:11478 设置最大调用深度:-Xss5m 最大深度:254422 设置最大调用深度:-Xss10m 最大深度:586522

2.3产生原因
  • 大多是存在递归代码,当线程请求的栈深度大于虚拟机所允许的深度,则抛出StackOverflowError异常;
  • 如果虚拟机栈可以动态扩展,在扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常
2.4如何避免
a.增加栈内存
b.减少递归深度调用 通过一定条件退出
相关文章链接:
<< << << << <<<自定义SPI和热部署技术破坏类加载器的双亲委派模式
<< << << <<<服务器CPU飙升为100%问题排查及如何避免
<< << << << << << << <<<一张图看懂CMS垃圾回收器的底层原理
<< << << << << <<

    推荐阅读