OOM三大场景和解决方案

本文详细解释了Java中的三种核心内存溢出场景:堆内存OOM、元空间(Metaspace)OOM和堆外内存OOM。介绍了在线和离线分析方法,包括使用jmap和Arthas工具,以及元空间内存管理、原因分析和解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

首先,说说什么是OOM?

Java OOM的三大核心场景

场景一、堆内存OOM

类型一:在线OOM分析,这个属于轻量级的分析:

类型二:离线OOM分析,这个属于轻量级的分析:

场景二:元空间(MetaSpace) OOM

什么是元空间(MetaSpace)

元空间(Metaspace) OOM现象

元空间(Metaspace) OOM 原因

如何定位和解决

元空间(Metaspace) OOM 解决办法:

场景三:堆外内存 OOM

堆外内存 OOM 现象

堆外内存 OOM 原因

堆外内存解决OOM对策


首先,说说什么是OOM?

OOM 全称 “Out Of Memory”,表示内存耗尽。

官方说明:Thrown when the Java Virtual Machine cannot allocate an object because it is out of memory, and no more memory could be made available by the garbage collector.

当 JVM 因为没有足够的内存来为对象分配空间,并且垃圾回收器也已经没有空间可供回收时,就会抛出这个错误。(注:非exception,已经严重到不足以被应用处理)。

为什么会出现 OOM,一般由这些问题引起

  1. 分配过少:JVM 初始化内存小,业务使用了大量内存;或者不同 JVM 区域分配内存不合理

  2. 内存泄漏:某一个对象被频繁申请,不用了之后却没有被释放,发生内存泄漏,导致内存耗尽

内存泄漏:申请使用完的内存没有释放,导致虚拟机不能再次使用该内存,此时这段内存就泄露了。因为申请者不用了,而又不能被虚拟机分配给别人用

内存溢出:申请的内存超出了 JVM 能提供的内存大小,此时称之为溢出

内存泄漏持续存在,最后一定会溢出,两者是因果关系

Java OOM的三大核心场景

图片

场景一、堆内存OOM

OOM的场景和解决方案

图片

分析方法通常有两种:

  • 类型一:在线分析,这个属于轻量级的分析:

  • 类型二:离线分析,这个属于重量级的分析:

类型一:在线OOM分析,这个属于轻量级的分析:

在线OOM分析,包括两种方法:

在线分析方法一:使用 jmap 分析TOP N对象

jmap(Java Memory Map)是jdk自带的java内存映像工具,使用jmap能够系统运行时的内存信息,同时能够将内存dump下来,分析内存泄露的问题。

  • 第一步:jmap 查看进程中占用资源最大的前N个对象,

  • 第二步:知道哪个对象消耗内存了,再去定位代码就不难了。然后 导出 快照文件 jmap -dump:live,format=b,file=文件路径/文件名 pid

这里我们使用它 -dump 选项,将内存信息dump到服务器某个地方,然后传到本地使用内存分析工具MAT进行内存分析。

jmap -dump:live,format=b,file=文件路径/文件名 pid

live:就是只dump 活着的对象 format=b 使用二进制 file= 快照文件保存路径


在线分析方法二:使用 Arthas 在线分析OOM

使用 Arthas 火焰图,分析TOP N对象 和调用堆栈

请参见视频, 和尼恩的《Arthas 学习圣经 v2》 最新版本

类型二:离线
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值