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

上一篇 << 下一篇 >>>JVM堆内存溢出和内存泄露问题定位和解决


1.元空间(方法区)溢出

1.1 错误现象

java.lang.OutOfMemoryError: Metaspace

1.2 原因

方法区空间已满

1.3 解决方案

调整方法区的配置,参照JVM性能调优的评估指标及调优示例

2.栈内存溢出

2.1错误现象

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垃圾回收器的底层原理
<< << << << << <<

你可能感兴趣的:(JVM元空间(方法区)和栈内存溢出原因及解决方案)