常见的OOM现象
1、HeapSize OOM 堆空间溢出
举例:while循环中不断的new Object();
堆空间溢出:old区域剩余的空间,无法满足将要晋升的对象的大小。
原因:错误的代码导致对象没有被回收。
并发导致内存没有被GC:代码提速
修改jvm参数:
FullGC:时间很长,可能是活着的对象很多,gc过程中,标记活着的对象所需要的时间很长,且每次gc完释放的空间很小。且会频繁GC。
2、PermGen OOM 永久带溢出
永久带存放的东西:class,常量,
案例:使用intern()不当会导致永久带溢出
案例:class卸载的条件和苛刻,当该class对应的ClassLoader下所有的class都没有活着的对象的时候,class才会被卸载【重要】
3、DirectBuffer OOM
属于 C Heap的一部分
终端 -----》 内存 ------》JVM I输入
jvm------》 内存 ------》 终端 O输出
Directbuffer 就是内存和jvm交互中的缓存部分。
MaxDirectMemorySize 来设置该区域的大小,超过该值,则报内存溢出
默认情况下:MaxDirectMemorySize = Xmx -1个Survivor
4、StackOverflowError OOM 栈溢出【native memory】
-Xss 设置其大小,默认空间在 256kb - 1M之间
案例:死递归
解决方法:控制递归的次数,当超过某个值时,停止递归调用。