1.异常出现位置
堆溢出、永久代/元空间溢出、方法栈溢出
2.堆溢出
java.lang.OutOfMemory : Java heap space
原因:
1.代码中可能存在大对象分配
2.可能存在内存泄漏,多次GC之后,还是无法找到一块足够大的内存容纳当前对象
解决方法:
1.检查是否存在大对象的分配,最有可能是大数组的分配
2.通过jmap命令,把堆内存dump下来,使用mat工具分析一下,检查是否存在内存泄漏问题
3.如果没有找到明显的内存泄漏,使用-Xmx加大堆内存
4.检查是否有大量的自定义的Finalizable对象
3.永久代/元空间溢出
java.lang.OutOfMemoryError: PermGen spacejava.lang.OutOfMemoryError: Metaspace
原因:
永生代是HotSpot虚拟机对方法区的具体实现,存放了被虚拟机加载的类信息、常量、静态变量、JIT编译后的代码
解决方法:
1.JDK之前,频繁的错误使用String.intern()方法
2.运行期间生成了大量的代理类,导致方法区被撑爆,无法卸载
3.应用长时间运行,没有重启
解决方法:
1.检查永生代空间或者元空间是否设置过小
2.检查代码中是否存在大量反射操作
3.dump之后通过mat检查是否生成了大量由反射生成的代理类
4.重启JVM
4.方法栈溢出
Java.lang.OutOfMemoryError:unable to create new native Thread
原因:创建了大量的线程导致的
解决方法:
1.通过-Xss降低每个线程大小的容量
2.线程总数也受到系统空闲内存和操作系统的限制,检查是否该系统有限制