OOM
堆内存溢出:
java.lang.OutOfMemoryError : Java heap space
1)先查看导致内存溢出的对象是否是必要的,也就是是否存在内存泄漏
2)如果是内存泄漏,借助工具查询内存泄漏的原因
3)如果是内存溢出,则查看 Xms 和 Xmx是否还可以进行调大一点。
(内存泄漏:应该回收掉的(用不到了),但是没有被回收!! )
【 导致内存泄漏的原因:该回收的对象仍然与 GC Roots对象通过引用链相连,导致无法回收。
静态常量集合中的对象
改变了对象的hash值
】
栈溢出(包含虚拟机栈和本地方法栈)
线程请求的栈帧深度大于允许的最大栈帧的深度 ,将抛出 StackOverFlowError . (显然,这很容易发生在递归当中,递归的终止条件设计的不合理)
设置 Xss参数,用来设置线程占用内存的大小。
java.lang.OutOfMemory: unable to create native thread
当不能创建新的线程时,就会抛出该异常,抛出异常的原因就是内存空间的剩余容量不足分配给新的线程,每个线程都是占有一定的内存空间的,可以通过 Xss参数来进行设定。(可见,也不能无限的创建线程啊!!!如果必须需要那么多的线程,那么就需要通过减少 堆空间 和 栈空间的容量了,也就是修改 Xmx 和 Xss参数)
元空间溢出
元空间默认是使用操作系统的直接内存的,但是我们也可以通过设置 -XX: MaxMetaSpaceSize参数来进行限制它的大小,元空间中存储类的信息,比类名、访问修饰符、字段描述、方法描述等。(当通过cglib动态代理,来生成大量的类时,可能会发生元空间溢出)
直接内存溢出
直接内存的容量大小可有 -XX: MaxDirectMemorySize 指定,不指定默认与 -Xmx 最大堆的设置一致,(底层用unsafe类中allocateMemory实现了直接内存的分配)
直接内存不是jvm运行时数据区域的一部分,(怪不得我觉得陌生呢^-^)
浙公网安备 33010602011771号