常见java OOM异常分析排查思路分析

news2024/9/20 5:37:19

Java 虚拟机(JVM)发生 OutOfMemoryError(OOM)异常时,表示 JVM 在尝试分配内存时无法找到足够的内存资源。以下是几种常见的导致 OOM 异常的情况:

1. Java 堆空间不足 (Java Heap Space)

这种情况发生在 JVM 堆内存耗尽,无法再为新的对象分配空间。

原因
  • 创建了大量对象且无法及时被垃圾回收。
  • 内存泄漏:对象持有引用无法被垃圾回收。
  • 内存中缓存过多数据。
解决方案
  • 调整 JVM 堆内存大小(增加 -Xmx 参数)。
  • 优化代码,减少内存消耗。
  • 检查并修复内存泄漏。
Java 堆溢出排查解决思路

1.查找关键报错信息,比如
java.lang.OutOfMemoryError: Java heap space
2.使用内存映像分析工具(如Jprofiler)对Dump出来的堆储存快照进行分析,分析清楚是内存泄漏还是内存溢出。
这里给出我安装整合idea参考的教程
JProfiler 11 安装与破解 - 哑吧 - 博客园
Intellij IDEA集成JProfiler性能分析神器-CSDN博客
3.如果是内存泄漏,可进一步通过工具查看泄漏对象到GC Roots的引用链,修复应用程序中的内存泄漏。
4.如果不存在泄漏,先检查代码是否有死循环,递归等,再考虑用 -Xmx 增加堆大小。
demo代码:

import java.util.ArrayList;
import java.util.List;

public class HeapOOM {
 static class OOMObject {
 }
 public static void main(String[] args) {
 List<OOMObject> list = new ArrayList<OOMObject>();
 //在堆中无限创建对象
 while (true) {
            list.add(new OOMObject());
 }
 }
}

按照排除解决方案。
1.查找报错关键信息
image.png

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

2.使用内存映像分析工具Jprofiler分析产生的堆储存快照
(1)我们可以先通过 top -c查看当前服务器进程并记录当前消耗cpu最高线程的pid。
在这里插入图片描述
比如发现当前线程pid为744的使用率最高。
(2)然后通过下面的命令到处jvm内存快照

jmap -dump:formart=b.file=java_pid_744.hprof 744
(java_pid_744.hprof是文件名。 744是通过top c查看消耗cpu使用率最高的线程id)  
然后下载到本地,下载先可以先压缩一下,这样可以节省时间。一个小技巧。

(3)使用上面下载好的JProfiler打开生成的单个快照
在这里插入图片描述
OOMObject这个类创建了11956010个实例,是属于内存溢出
然后点击这个最大对象分析
image.png
然后我这时候电脑卡着了,借用网图给接下来步骤说明
打开后右键打开使用选定对象
image.png
在这里插入图片描述
然后这里会显示详细的日志
image.png这里可以看见具体的代码块。然后我们就可以定位代码结合具体代码进行分析。发现死循环了。
image.png

2.线程栈空间不足 (Stack Overflow)

关于虚拟机栈和本地方法栈,在Java虚拟机规范中描述了两种异常:

  • 如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError 异常;
  • 如果虚拟机栈可以动态扩展,当扩展时无法申请到足够的内存时会抛出 OutOfMemoryError 异常。
原因
  • 在单个线程下,栈帧太大,或者虚拟机栈容量太小,当内存无法分配的时候,虚拟机抛出StackOverflowError 异常。
  • 不断地建立线程的方式会导致内存溢出。
解决方案
  • 优化代码,避免过深的递归调用。
  • 调整线程栈大小(增加 -Xss 参数)。
栈溢出排查解决思路

查找关键报错信息,确定是StackOverflowError还是OutOfMemoryError
如果是StackOverflowError,检查代码是否递归调用方法等
如果是OutOfMemoryError,检查是否有死循环创建线程等,通过-Xss降低的每个线程栈大小的容量

demo代码
public class JavaVMStackOOM {
    private void dontStop() {
        while (true) {

        }
    }

    public void stackLeakByThread() {
        while (true) {
            Thread thread = new Thread(new Runnable() {
                public void run() {
                    dontStop();
                }
            });
            thread.start();
        }
    }

    public static void main(String[] args) {
        JavaVMStackOOM oom = new JavaVMStackOOM();
        oom.stackLeakByThread();
    }

}

1.报错信息
Exception in thread “main” java.lang.OutOfMemoryError: unable to create new native thread
2.定位dontStop 方法是一个无限循环,线程一旦执行这个方法,将会一直循环下去
3.排查代码,确定是否显示使用死循环创建线程

3.方法区溢出

方法区,(又叫永久代,JDK8后,元空间替换了永久代),用于存放Class的相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等。运行时产生大量的类,会填满方法区,造成溢出。

方法区溢出原因

使用CGLib生成了大量的代理类,导致方法区被撑爆
在Java7之前,频繁的错误使用String.intern方法
大量jsp和动态产生jsp
应用长时间运行,没有重启

方法区溢出排查解决思路

调整元空间大小(增加 -XX:MaxMetaspaceSize 参数)
检查代码是否频繁错误得使用String.intern方法
优化类加载机制,减少不必要的类加载,检查是否使用CGLib生成了大量的代理类
重重启JVM

4.本机内存不足 (Native Memory Exhaustion)

这种情况发生在本机内存耗尽时。

原因
  • 本机代码分配了大量内存(如 JNI 调用)。
  • 内存泄漏。
解决方案
  • 检查并优化本机代码。
  • 确保本机内存使用合理。

比如:
NIO程序中,使用ByteBuffer.allocteDirect(capability)分配的是直接内存,可能导致直接内存溢出。
image.png
ByteBuffer分配128MB直接内存,而JVM参数-XX:MaxDirectMemorySize=100M指定最大是100M,因此发生直接内存溢出。

5.GC 造成的内存不足 (GC Overhead Limit Exceeded)

这种情况发生在垃圾回收频繁且回收效果不明显时(超过98%的时间用来做GC并且回收了不到2%的堆内存时会抛出此异常。)。

原因
  • 程序创建对象过快,垃圾回收无法跟上。
  • 内存不足,垃圾回收无法有效清理。
解决方案
  • 检查JVM参数-Xmx -Xms是否合理
  • 检查项目中是否有大量的死循环或有使用大内存的代码,优化代码。
  • 增加 JVM 堆内存大小。
  • 优化代码,减少对象创建速度。
  • 使用更高效的垃圾回收器(如 G1 GC)。
demo
public class GCoverheadTest {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(10);
        for (int i = 0; i < Integer.MAX_VALUE; i++) {
            executor.execute(() -> {
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    //do nothing
                }
            });
        }
    }

}
  • 任务积压:线程池的大小是 10,这意味着同时最多只有 10 个任务在执行。其余的任务会被放入线程池的任务队列中等待执行。由于循环是无限的,任务会不断地被提交,导致任务队列不断增大。
  • 内存消耗:随着任务队列中的任务越来越多,系统的内存消耗也会不断增加。最终,可能会导致内存耗尽,抛出 OutOfMemoryError 异常。
  • 线程池饱和:线程池中的 10 个线程会不断地从任务队列中取任务执行,但由于每个任务都要休眠 10 秒钟,任务处理的速度远远跟不上任务提交的速度,导致任务队列越来越长。

总结

最后给出常见OOM异常

java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: unable to create new native thread
java.lang.OutOfMemoryError: Metaspace
java.lang.OutOfMemoryError: Direct buffer memory
java.lang.OutOfMemoryError: GC overhead limit exceeded

推荐阅读:
以上图片部分来自于下面链接,如有侵权,请联系本人
常见java OOM异常分析(原因+排查解决思路+demo代码)_java oom异常的原因分析-CSDN博客
使用JProfiler分析OOM系统快照_jprofiler如何打开快照-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2056841.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【小球下落反弹】小球自由落下,每次落地后反跳回原高度的一半

一小球从100米高度自由落下&#xff0c;每次落地后反跳回原高度的一半&#xff1b;再落下&#xff0c;求它在第10次落地时&#xff0c;共经过多少米&#xff1f;第10次反弹多高&#xff1f; 使用C语言实现&#xff0c;具体代码&#xff1a; #include<stdio.h>int main(…

wo是如何克服编程学习中的挫折感的?

你是如何克服编程学习中的挫折感的&#xff1f; 编程学习之路上&#xff0c;挫折感就像一道道难以逾越的高墙&#xff0c;让许多人望而却步。然而&#xff0c;真正的编程高手都曾在这条路上跌倒过、迷茫过&#xff0c;却最终找到了突破的方法。你是如何在Bug的迷宫中找到出口的…

HarmonyOs透明弹窗(选择照片弹窗样式)

1.鸿蒙中需要实现一个如下图的弹窗 2.由上图中可以得出&#xff0c;只需要三个Text组件依次向下排列&#xff0c;弹窗背景设置透明即可&#xff0c;弹窗代码如下(仅展示弹窗样式)&#xff1a; /**** 自定义选择图片弹窗** 外部定义需要导出*/ CustomDialog //自定义弹窗 export…

Linux驱动学习之点灯(一)

学习不同的板子我们都是从点灯开始&#xff0c;linux驱动也不例外 驱动开发基础知识 何为驱动&#xff1f; 驱使硬件正常工作的代码就叫做驱动。 在一些mcu里&#xff1a; 无非就是直接操作寄存器&#xff0c;或者用库函数初始化外设&#xff0c;使外设正常工作如初始化iic&…

leetcode13. 罗马数字转整数,流程图带你遍历所有情况

leetcode13. 罗马数字转整数 示例 1: 输入: s “III” 输出: 3 示例 2: 输入: s “IV” 输出: 4 示例 3: 输入: s “IX” 输出: 9 示例 4: 输入: s “LVIII” 输出: 58 解释: L 50, V 5, III 3. 示例 5: 输入: s “MCMXCIV” 输出: 1994 解释: M 1000, CM 900, XC…

一个贼好用的开源导航网站项目——pintree!【送源码】

这两天发现了一个项目&#xff0c;它可以快速的将收藏夹里的网址导出&#xff0c;然后快速生成一个在线的网站。这个项目就是 pintree。 项目简介 Pintree 是一个开源项目&#xff0c;旨在将浏览器书签转换为导航网站。只需几个简单的步骤&#xff0c;就可以将书签转变为美观…

【CAN-IDPS】汽车网关信息安全要求以及实验方法

《汽车网关信息安全技术要求及试验方法》是中国的一项国家标准,编号为GB/T 40857-2021,于2021年10月11日发布,并从2022年5月1日起开始实施 。这项标准由全国汽车标准化技术委员会(TC114)归口,智能网联汽车分会(TC114SC34)执行,主管部门为工业和信息化部。 该标准主要…

集团数字化转型方案(二)

集团数字化转型方案通过整合物联网&#xff08;IoT&#xff09;、大数据分析、人工智能&#xff08;AI&#xff09;和云计算技术&#xff0c;构建了一个全面智能化的业务平台&#xff0c;从而实现了全集团范围内的业务流程自动化、数据驱动决策优化、以及客户体验的个性化提升。…

windows11 安装 Rancher Desktop

从官网下载了最新版的 Rancher.Desktop.Setup.1.8.1.msi 安装包&#xff0c;安装很顺利。 但是安装完&#xff0c;启动时报错 The k3s cache is empty and there is no network connection. 不明所以&#xff0c;网上查了&#xff0c;原来是github访问不了的原因&#xff0c;具…

这些星座比你想象的还努力

TOP 3. 金牛座   金牛座对于操劳操心的忍受度本来就比较高&#xff0c;对于金牛座来说这些都是踏实的象征&#xff0c;金牛座比较不相信不劳而获这件事情&#xff0c;多少血汗多少付出&#xff0c;得到多少收获&#xff0c;这让金牛座比较踏实&#xff0c;不会觉得很不安&…

CE游戏教程第三关解密

游戏规则&#xff1a;雪人可以左右移动&#xff0c;跳跃&#xff0c;跳跃到红线上&#xff0c;红线变绿&#xff0c;所有红线变率时&#xff0c;门开启&#xff0c;雪人通过门后&#xff0c;游戏胜利。如果游戏中触碰到NPC&#xff0c;游戏失败&#xff01; 经过研究&#xff…

DHCP的原理与配置

目录 DHCP的原理 DHCP是什么 DHCP的好处 DHCP的分配方式 DHCP的工作原理 DHCP的配置 环境设置 DHCP配置 验证配置是否成功 DHCP的原理 DHCP是什么 DHCP:Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议。由Internet工作小组开发&#xff0c;专门用…

自然语言处理NLP四范式

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhlNLP四范式概述 自然语言处理(NLP)的四范式是NLP领域发展历程中的重要里程碑,它们代表了NLP技术从传统方法到现代深度学习技术的转变。第一范式是非神经网络时代的完全监督学习,它依赖于人工设…

Python基础知识学习总结(五)

一. 字典 字典是另一种可变容器模型&#xff0c;且可存储任意类型对象。 字典的每个键值 key>value 对用冒号 : 分割&#xff0c;每个对之间用逗号( , )分割&#xff0c;整个字典包括在花括号 {} 中 。 dict 作为 Python 的关键字和内置函数&#xff0c;变量名不建议命名…

CompletableFuture-应用

可以看到CompletableFuture实现了CompletionStage 和Future的两个接口。CompletionStage提供了任务之间的衔接能力&#xff0c;而Future则是经常用于阻塞获取结果。 CompletableFuture 的内部使用了基于 ForkJoinPool 的线程池&#xff0c;这种线程池可以高效地调度和执行任务…

数据结构与算法--交换排序与归并排序

文章目录 回顾提要冒泡排序冒泡排序的过程冒泡排序的实现冒泡排序算法评价 快速排序快速排序的划分方法快速排序的过程快速排序的实现快速排序算法性能分析快速排序的改进 归并排序二路归并排序合并两个有序表归并排序示例归并排序算法性能分析 各种内排序方法的比较各种内排序…

SOCKS5代理UDP转发:探秘网络世界的隐形传送带

在这个信息爆炸的时代&#xff0c;网络已经成为我们生活中不可或缺的一部分。然而&#xff0c;网络世界中也充满了各种问题和挑战&#xff0c;比如隐私保护、数据传输的安全性等。今天&#xff0c;我们就来聊聊一种神奇的网络工具——SOCKS5代理&#xff0c;特别是它在UDP转发中…

在撰写跨学科论文时,如何平衡不同研究领域的篇幅和深度?

在学术界&#xff0c;跨学科研究因其能够综合不同领域的知识和方法而受到重视。然而&#xff0c;如何在一篇论文中平衡不同学科的篇幅和深度&#xff0c;是一个常见的挑战。本文将探讨一些有效的策略&#xff0c;帮助你在撰写跨学科论文时&#xff0c;既能展现每个领域的深度&a…

数字产业生态圈如何推动产业加速升级?

在数字化浪潮的推动下&#xff0c;数字产业生态圈逐渐成为产业升级的重要载体。它不仅汇聚了技术创新的源头活水&#xff0c;更通过以下几大途径&#xff0c;为产业注入强劲动力&#xff1a; 1、资源整合&#xff1a;数字产业生态圈将政府、企业、科研机构和高校等多方资源整合…

一个案例讲清5Why分析法,分分钟Get!

探究问题深处的“ 5 why究竟法”&#xff0c;这可不是普通的连连问&#xff0c;而是由丰田创始人丰田佐吉精心锻造的问题挖掘秘籍。简而言之&#xff0c;就是当你遇到一个谜题&#xff0c;连环出击五个“为啥呢&#xff1f;”&#xff0c;一步步揭秘真相的核心。想象一下&#…