前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >常见java OOM异常分析排查思路分析

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

作者头像
阿珍
发布于 2024-09-06 07:23:03
发布于 2024-09-06 07:23:03
23900
代码可运行
举报
运行总次数:0
代码可运行

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代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java 代码解读复制代码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.查找报错关键信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
arduino 代码解读复制代码Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

2.使用内存映像分析工具Jprofiler分析产生的堆储存快照 (1)我们可以先通过 top -c查看当前服务器进程并记录当前消耗cpu最高线程的pid。

比如发现当前线程pid为744的使用率最高。 (2)然后通过下面的命令到处jvm内存快照

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ini 代码解读复制代码jmap -dump:formart=b.file=java_pid_744.hprof 744
(java_pid_744.hprof是文件名。 744是通过top c查看消耗cpu使用率最高的线程id)  
然后下载到本地,下载先可以先压缩一下,这样可以节省时间。一个小技巧。

(3)使用上面下载好的JProfiler打开生成的单个快照

OOMObject这个类创建了11956010个实例,是属于内存溢出 然后点击这个最大对象分析

然后我这时候电脑卡着了,借用网图给接下来步骤说明 打开后右键打开使用选定对象

然后这里会显示详细的日志

这里可以看见具体的代码块。然后我们就可以定位代码结合具体代码进行分析。发现死循环了。

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

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

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

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

demo代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
typescript 代码解读复制代码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)分配的是直接内存,可能导致直接内存溢出。

ByteBuffer分配128MB直接内存,而JVM参数-XX:MaxDirectMemorySize=100M指定最大是100M,因此发生直接内存溢出。

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

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

原因
  • 程序创建对象过快,垃圾回收无法跟上。
  • 内存不足,垃圾回收无法有效清理。
解决方案
  • 检查JVM参数-Xmx -Xms是否合理
  • 检查项目中是否有大量的死循环或有使用大内存的代码,优化代码。
  • 增加 JVM 堆内存大小。
  • 优化代码,减少对象创建速度。
  • 使用更高效的垃圾回收器(如 G1 GC)。
demo
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
typescript 代码解读复制代码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 秒钟,任务处理的速度远远跟不上任务提交的速度,导致任务队列越来越长。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
面对各种数据怎么处理 : 特征工程之特征表达
地址:https://www.cnblogs.com/pinard/p/9032759.html
机器学习算法工程师
2018/07/26
1.3K0
特征工程系列:特征预处理(下)
关于作者:JunLiang,一个热爱挖掘的数据从业者,勤学好问、动手达人,期待与大家一起交流探讨机器学习相关内容~
木东居士
2019/08/16
2.6K0
特征工程系列:特征预处理(下)
机器学习实战 | 机器学习特征工程最全解读
教程地址:http://www.showmeai.tech/tutorials/41
ShowMeAI
2022/03/22
2K0
机器学习实战 | 机器学习特征工程最全解读
​特征工程系列:特征预处理(上)
关于作者:JunLiang,一个热爱挖掘的数据从业者,勤学好问、动手达人,期待与大家一起交流探讨机器学习相关内容~
石晓文
2019/08/29
1.4K0
​特征工程系列:特征预处理(上)
​特征工程系列:特征预处理(上)
关于作者:JunLiang,一个热爱挖掘的数据从业者,勤学好问、动手达人,期待与大家一起交流探讨机器学习相关内容~
木东居士
2019/08/08
1K0
​特征工程系列:特征预处理(上)
特征工程之数据规范化
Max-abs (极大值标准化),标准化之后的每一维特征最大要素为1,其余要素均小于1,理论公式如下:
用户3577892
2020/06/12
2.1K0
特征工程方法综述
根据文章内容撰写摘要总结
DevOps时代
2017/07/12
6.5K2
特征工程方法综述
特征工程
举例梯度下降实例说明归一化的重要性,若两个特征的取值范围不一样,则在学习速率相同的情况下,范围小的特征更新速度会大于取值范围大的特征,需要较多的迭代才能找到最优解。若将两个特征归一化到相同的数值区间,两特征的更新速度变得更为一致,容易更快地通过梯度下降找到最优解。
全栈程序员站长
2021/05/20
4540
特征工程系列:GBDT特征构造以及聚类特征构造
关于作者:JunLiang,一个热爱挖掘的数据从业者,勤学好问、动手达人,期待与大家一起交流探讨机器学习相关内容~
木东居士
2019/10/30
2K0
特征工程系列:GBDT特征构造以及聚类特征构造
机器学习归一化特征编码
因为对于大多数的机器学习算法和优化算法来说,将特征值缩放到相同区间可以使得获取性能更好的模型。就梯度下降算法而言,例如有两个不同的特征,第一个特征的取值范围为1——10,第二个特征的取值范围为1——10000。在梯度下降算法中,代价函数为最小平方误差函数,所以在使用梯度下降算法的时候,算法会明显的偏向于第二个特征,因为它的取值范围更大。在比如,k近邻算法,它使用的是欧式距离,也会导致其偏向于第二个特征。对于决策树和随机森林以及XGboost算法而言,特征缩放对于它们没有什么影响。
@小森
2024/06/15
1580
机器学习归一化特征编码
图解机器学习特征工程
上图为大家熟悉的机器学习建模流程图(扩展阅读:一文全览机器学习建模流程(Python代码)),整个建模流程非常重要的一步,是对于数据的预处理和特征工程,它很大程度决定了最后建模效果的好坏。
算法进阶
2023/09/01
1.4K0
图解机器学习特征工程
风控领域特征工程
在金融行业,风险控制(风控)是核心环节,它关乎资产安全、合规性以及机构的长期稳健发展。随着大数据时代的到来,金融机构面临着前所未有的数据量和复杂性。在这样的背景下,风控领域特征工程应运而生,成为连接原始数据与精准风险评估的桥梁。
用户3578099
2024/08/20
6050
风控领域特征工程
特征工程的方法论,一般都这么做
向AI转型的程序员都关注了这个号👇👇👇 机器学习AI算法工程   公众号:datayx AI算法工程师交流群 一.为什么要做特征工程 1.选对模型有用的特征,让模型达到尽可能大的性能(准确率); 2.剔除掉无用特征,减少模型的过拟合,增加模型泛化能力; 2.对有用特征做相应变化处理,减少模型复杂性,增加模型的性能; 二.特征工程都要做什么 1.特征采集评估 主要是评估需要采集的成本,特征的完整性,特征的有效性 2.特征预处理 做特征的定性分析,缺失值、异常值,基本特征编码和变化 3.特征无量纲化 将特征从
机器学习AI算法工程
2022/06/10
1.1K0
特征工程的方法论,一般都这么做
【机器学习数据预处理】特征工程
  上篇文章介绍了机器学习数据预处理的数据准备这一部分的内容,本文介绍数据预处理的特征工程部分。
Francek Chen
2025/01/22
3010
【机器学习数据预处理】特征工程
特征工程(中)- 特征表达
从一个完整的机器学习任务来看,在选择完特征之后,特征表达的任务就是要将一个个的样本抽象成数值向量,供机器学习模型使用。因此,特征表达就要兼顾特征属性和模型需求这两个方面。
小萌哥
2020/07/21
7600
机器学习算法竞赛实战-特征工程
取对数log转换可以将倾斜数据变得接近正态分布,一般是使用log(x+1),其中加1是防止数据等于0,同时保证x是正的。
皮大大
2023/08/25
6190
机器学习算法竞赛实战-特征工程
特征工程之数据预处理
前面我们说过,特征工程在数据挖掘任务中非常重要,可以说直接关系着后续模型效果的好坏。不过要做好特征工程并不容易,它既需要对业务有深入的理解,还要求掌握扎实的专业知识。在数据分析中,常用的特征工程方法包括特征放缩和特征编码,前者主要是归一化和正则化,用于消除量纲关系的影响。后者包括了序号编码、独热编码等,主要是处理类别型、文本型以及连续型特征。下面将给大家分别介绍特征放缩和特征编码的具体处理方法。
用户7569543
2020/07/17
8050
使用sklearn做特征工程
目录 1 特征工程是什么? 2 数据预处理   2.1 无量纲化     2.1.1 标准化     2.1.2 区间缩放法     2.1.3 标准化与归一化的区别   2.2 对定量特征二值化   2.3 对定性特征哑编码   2.4 缺失值计算   2.5 数据变换   2.6 回顾 3 特征选择   3.1 Filter     3.1.1 方差选择法     3.1.2 相关系数法     3.1.3 卡方检验     3.1.4 互信息法   3.2 Wrapper     3.2.1 递归特征
机器学习AI算法工程
2018/03/14
2.3K0
使用sklearn做特征工程
利用Python进行常见的特征工程
上期说到数据分析师一般对业务数据提取的时候就会进行数据清洗,也会做一些业务逻辑或者数据逻辑上的特征处理。但由于特征工程是数据建模重要的一环,所以这里就做一个简单的总结。希望能给大家带来一些小小地帮助~
HsuHeinrich
2023/03/29
1K0
利用Python进行常见的特征工程
独家 | 一文读懂特征工程
本文结构 1. 概述 机器学习被广泛定义为“利用经验来改善计算机系统的自身性能”。事实上,“经验”在计算机中主要是以数据的形式存在的,因此数据是机器学习的前提和基础。数据来源多种多样,它可以是结构数据,如数值型、分类型,也可以是非结构数据,如文本、语音、图片、视频。对于所有机器学习模型,这些原始数据必须以特征的形式加入到机器学习模型当中,并进行一定的提取和筛选工作。所谓特征提取,就是逐条将原始数据转化为特征向量的形式,此过程涉及数据特征的量化表示;而特征筛选是在已提取特征的基础上,进一步对高维度和
数据派THU
2018/01/29
1.2K0
独家 | 一文读懂特征工程
相关推荐
面对各种数据怎么处理 : 特征工程之特征表达
更多 >
LV.2
奇遇网络科技有限公司产品经理
目录
  • 1. Java 堆空间不足 (Java Heap Space)
    • 原因
    • 解决方案
    • Java 堆溢出排查解决思路
  • 2.线程栈空间不足 (Stack Overflow)
    • 原因
    • 解决方案
    • 栈溢出排查解决思路
    • demo代码
  • 3.方法区溢出
    • 方法区溢出原因
    • 方法区溢出排查解决思路
  • 4.本机内存不足 (Native Memory Exhaustion)
    • 原因
    • 解决方案
  • 5.GC 造成的内存不足 (GC Overhead Limit Exceeded)
    • 原因
    • 解决方案
    • demo
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档