可能出现OOM的区域和情况分析

1. MetaSpace

加载太多类 metaspace 塞不下的时候会导致 full gc,连带回收老年代空间 但是类的元数据要被回收掉的条件比较苛刻的

  • 对应的类加载器要先被回收了
  • 类的所有实例对象要被回收

所以回收效果比较差,塞不下了 导致内存溢出

1.1元数据区出现oom的原因可能有

  1. 没有设置 metaspace 大小,默认的设置只有几十m 太小了 => 通常设置为: -XX:MaxMeataspaceSize=512M -XX:MetaspaceSize=512M 就够了
  2. 系统内使用了 cglib 之类的技术动态生成类,代码没有控制好导致生成过多类

2. Java虚拟机栈

方法调用太深, 一般是递归、循环调用

3. 堆内存

生成的对象太多/太大/太快,heap 满了 full gc后还是放不下
a. 系统并发太高,请求量太高 => 加机器
b. 存在内存泄露问题,不用的对象删除引用,导致内存回收不掉

posted @ 2021-03-18 01:39  mushishi  阅读(232)  评论(0编辑  收藏  举报