1、Java堆溢出
原因:
代码中可能存在大对象分配
可能存在内存泄漏,导致在多次GC之后,还是无法找到一块足够大的内存容纳当前对象
解决方法:
检查是否存在大对象的分配,最有可能的是大数组分配
通过jmap命令,把堆内存dump下来,使用mat工具分析一下,检查是否存在内存泄露的问题
如果没有找到明显的内存泄露,使用 -Xmx 加大堆内存
检查是否有大量的自定义的 Finalizable 对象,也有可能是框架内部提供的,考虑其存在的必要性
2、永久代/元空间溢出
原因:
永久代/元空间是jdk不同版本对方法区的具体实现,可能因为生成大量代理类或者应用长时间运行未重启而导致溢出
3、GC overhead limit exceeded
原因:
超过98%的时间用来做GC并且回收了不到2%的堆内存时会抛出此异常。
4、方法栈溢出
原因:
出现这种异常,基本上都是创建的了大量的线程导致的,也可能是因为程序中存在没有出口的递归导致的
5、非常规溢出
分配超大数组
swap溢出:swap(交换分区),类似于虚拟内存,当内存不足时把一部分硬盘空间虚拟成内存使用
本地方法溢出
原文:https://www.cnblogs.com/Water2Wine/p/13504139.html