JVM 发生 OOM 的 8 种原因、及解决办法
大家好,我是指北君。
作为一个Java软件开发工程师,JVM的相关知识是必不可少的,而JVM发生OOM的排查与解决也是面试当中的重中之重,所以,今天指北君就来聊聊JVM发生OOM的几种原因与解决办法
1. 堆空间使用过多
原因:
1、Java 堆中无法再分配对象
2、对象被引用,导致对象无法被 GC 回收
3、应用程序过度使用 finalizer。finalizer 对象不能被 GC 立刻回收。
解决方案
1、通过调节JVM参数 -Xmx 增加堆大小
2、优化程序,解决内存泄漏问题
2. GC 开销过大
原因
1、Java不断的
解决方案
1、通过调节JVM参数 -Xmx 增加堆大小
2、通过调节JVM参数 -XX:-UseGCOverheadLimit 取消 GC 开销限制
3、修复应用程序中的内存泄漏
3. 请求的数组大小超过虚拟机限制
原因
1、应用程序试图分配一个超过堆大小的数组
解决方案
1、通过调节JVM参数 -Xmx 增加堆大小
2、优化代码,不要一次性分配这么大的数组
4. Perm gen 空间
原因
Perm gen 空间包含:
1、类的名字、字段、方法
2、与类相关的对象数组和类型数组
3、JIT 编译器优化
当 Perm gen 空间用尽时,将抛出异常。
解决方案
1、通过调节JVM参数 -XX: MaxPermSize 增加 Permgen 大小
5. Metaspace
原因
1、从 Java 8 开始 Perm gen 改成了 Metaspace,在本机内存中分配 class 元数据(称为 metaspace)。如果 metaspace 耗尽,则抛出异常
解决方案
1、调节参数 -XX: MaxMetaSpaceSize 增加 metaspace 大小
2、增加服务器的内存
3、检查代码,可能是bug引起的
6. 发生 stack_trace_with_native_method
原因
1、native method 分配失败
2、查看堆栈信息,最顶层的帧是 native method
解决方案
1、使用操作系统本地工具进行诊断
7. 杀死进程或子进程
原因
1、内存不足,在可用内存极低的情况下会杀死进程
解决方案
1、将进程迁移到不同的机器上
2、给机器增加更多内存
3、这是由操作系统而非 JVM 触发的。
好了,今天的内容就讲完了了。
我是指北君,操千曲而后晓声,观千剑而后识器。感谢各位人才的:点赞、收藏和评论,我们下期更精彩!