1. MetaSpace
加载太多类 metaspace 塞不下的时候会导致 full gc,连带回收老年代空间 但是类的元数据要被回收掉的条件比较苛刻的
- 对应的类加载器要先被回收了
- 类的所有实例对象要被回收
所以回收效果比较差,塞不下了 导致内存溢出
1.1元数据区出现oom的原因可能有
- 没有设置 metaspace 大小,默认的设置只有几十m 太小了 => 通常设置为: -XX:MaxMeataspaceSize=512M -XX:MetaspaceSize=512M 就够了
- 系统内使用了 cglib 之类的技术动态生成类,代码没有控制好导致生成过多类
2. Java虚拟机栈
方法调用太深, 一般是递归、循环调用
3. 堆内存
生成的对象太多/太大/太快,heap 满了 full gc后还是放不下
a. 系统并发太高,请求量太高 => 加机器
b. 存在内存泄露问题,不用的对象删除引用,导致内存回收不掉