作为一个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 触发的。
 
                    
此处评论已关闭