out of memory原因(out of memory at)

2024-01-20 10:11 星期六 104点热度 0人点赞

out of memory原因(out of memory at)插图

OOM 意味着程序存在着漏洞,可能是代码或者 JVM 参数配置引起的。这篇文章和读者聊聊,Java 进程触发了 OOM 后如何排查

常说对生产环境保持敬畏之心,快速解决问题也是一种敬畏的表现

OOM 全称 “Out Of Memory”,表示内存耗尽。当 JVM 因为没有足够的内存来为对象分配空间,并且垃圾回收器也已经没有空间可回收时,就会抛出这个错误

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

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

代码漏洞:某一个对象被频繁申请,不用了之后却没有被释放,导致内存耗尽

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

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

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

比较常见的 OOM 类型有以下几种

java.lang.OutOfMemoryError: PermGen space

Java7 永久代(方法区)溢出,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。每当一个类初次加载的时候,元数据都会存放到永久代

一般出现于大量 Class 对象或者 JSP 页面,或者采用 CgLib 动态代理技术导致

我们可以通过 -XX:PermSize 和 -XX:MaxPermSize 修改方法区大小

Java8 将永久代变更为元空间,报错:java.lang.OutOfMemoryError: Metadata space,元空间内存不足默认进行动态扩展

java.lang.StackOverflowError

虚拟机栈溢出,一般是由于程序中存在 死循环或者深度递归调用 造成的。如果栈大小设置过小也会出现溢出,可以通过 -Xss 设置栈的大小

虚拟机抛出栈溢出错误,可以在日志中定位到错误的类、方法

java.lang.OutOfMemoryError: Java heap space

Java 堆内存溢出,溢出的原因一般由于 JVM 堆内存设置不合理或者内存泄漏导致

如果是内存泄漏,可以通过工具查看泄漏对象到 GC Roots 的引用链。掌握了泄漏对象的类型信息以及 GC Roots 引用链信息,就可以精准地定位出泄漏代码的位置

如果不存在内存泄漏,就是内存中的对象确实都还必须存活着,那就应该检查虚拟机的堆参数(-Xmx 与 -Xms),查看是否可以将虚拟机的内存调大些

小结:方法区和虚拟机栈的溢出场景不在本篇过多讨论,下面主要讲解常见的 Java 堆空间的 OOM 排查思路

假设我们 Java 应用 PID 为 15162,输入命令查看 JVM 内存分布 jmap -heap 15162

[xxx@xxx ~]# jmap -heap 15162

Attaching to process ID 15162, please wait...

Debugger attached successfully.

Server compiler detected.

JVM version is 25.161-b12

using thread-local object allocation.

Mark Sweep Compact GC

Heap Configuration:

MinHeapFreeRatio = 40 # 最小堆使用比例

MaxHeapFreeRatio = 70 # 最大堆可用比例

MaxHeapSize = 482344960 (460.0MB) # 最大堆空间大小

NewSize = 10485760 (10.0MB) # 新生代分配大小

MaxNewSize = 160759808 (153.3125MB) # 最大新生代可分配大小

OldSize = 20971520 (20.0MB) # 老年代大小

NewRatio = 2 # 新生代比例

SurvivorRatio = 8 # 新生代与 Survivor 比例

MetaspaceSize = 21807104 (20.796875MB) # 元空间大小

CompressedClassSpaceSize = 1073741824 (1024.0MB) # Compressed Class Space 空间大小限制

MaxMetaspaceSize = 17592186044415 MB # 最大元空间大小

G1HeapRegionSize = 0 (0.0MB) # G1 单个 Region 大小

Heap Usage: # 堆使用情况

New Generation (Eden + 1 Survivor Space): # 新生代

capacity = 9502720 (9.0625MB) # 新生代总容量

used = 4995320 (4.763908386230469MB) # 新生代已使用

free = 4507400 (4.298591613769531MB) # 新生代剩余容量

52.56726495150862% used # 新生代使用占比

Eden Space:

capacity = 8454144 (8.0625MB) # Eden 区总容量

used = 4029752 (3.8430709838867188MB) # Eden 区已使用

free = 4424392 (4.219429016113281MB) # Eden 区剩余容量

47.665996699370154% used # Eden 区使用占比

From Space: # 其中一个 Survivor 区的内存分布

capacity = 1048576 (1.0MB)

used = 965568 (0.92083740234375MB)

free = 83008 (0.07916259765625MB)

92.083740234375% used

To Space: # 另一个 Survivor 区的内存分布

capacity = 1048576 (1.0MB)

used = 0 (0.0MB)

free = 1048576 (1.0MB)

0.0% used

tenured generation: # 老年代

capacity = 20971520 (20.0MB)

used = 10611384 (10.119804382324219MB)

free = 10360136 (9.880195617675781MB)

50.599021911621094% used

10730 interned Strings occupying 906232 bytes.

通过查看 JVM 内存分配以及运行时使用情况,可以判断内存分配是否合理

另外,可以在 JVM 运行时查看最耗费资源的对象,jmap -histo:live 15162 | more

JVM 内存对象列表按照对象所占内存大小排序

instances:实例数

bytes:单位 byte

class name:类名

明显看到 CustomObjTest 对象实例以及占用内存过多

可惜的是,方案存在局限性,因为它只能排查对象占用内存过高问题

其中 “[” 代表数组,例如 “[C” 代表 Char 数组,”[B” 代表 Byte 数组。如果数组内存占用过多,我们不知道哪些对象持有它,所以就需要 Dump 内存进行离线分析

jmap -histo:live 执行此命令,JVM 会先触发 GC,再统计信息

Dump 文件是 Java 进程的内存镜像,其中主要包括 系统信息、虚拟机属性、完整的线程 Dump、所有类和对象的状态 等信息

当程序发生内存溢出或 GC 异常情况时,怀疑 JVM 发生了 内存泄漏,这时我们就可以导出 Dump 文件分析

JVM 启动参数配置添加以下参数

-XX:+HeapDumpOnOutOfMemoryError

-XX:HeapDumpPath=./(参数为 Dump 文件生成路径)

当 JVM 发生 OOM 异常自动导出 Dump 文件,文件名称默认格式:java_pid{pid}.hprof

上面配置是在应用抛出 OOM 后自动导出 Dump,或者可以在 JVM 运行时导出 Dump 文件

jmap -dump:file=[文件路径] [pid]

# 示例

jmap -dump:file=./jvmdump.hprof 15162

在本地写一个测试代码,验证下 OOM 以及分析 Dump 文件

设置 VM 参数:-Xms3m -Xmx3m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./

public static void main(String[] args) {

List oomList = Lists.newArrayList();

// 无限循环创建对象

while (true) {

oomList.add(new Object());

}

}

通过报错信息得知,java heap space 表示 OOM 发生在堆区,并生成了 hprof 二进制文件在当前文件夹下

JvisualVM 分析

Dump 分析工具有很多,相对而言 JvisualVMJProfilerEclipse Mat,使用人群更多一些。下面以 JvisualVM 举例分析 Dump 文件

列举两个常用的功能,第一个是能看到触发 OOM 的线程堆栈,清晰得知程序溢出的原因

第二个就是可以查看 JVM 内存里保留大小最大的对象,可以自由选择排查个数

点击对象还可以跳转具体的对象引用详情页面

文中 Dump 文件较为简单,而正式环境出错的原因五花八门,所以不对该 Dump 文件做深度解析

注意:JvisualVM 如果分析大 Dump 文件,可能会因为内存不足打不开,需要调整默认的内存

线上如遇到 JVM 内存溢出,可以分以下几步排查

jmap -heap 查看是否内存分配过小

jmap -histo 查看是否有明显的对象分配过多且没有释放情况

jmap -dump 导出 JVM 当前内存快照,使用 JDK 自带或 MAT 等工具分析快照

如果上面还不能定位问题,那么需要排查应用是否在不断创建资源,比如网络连接或者线程,都可能会导致系统资源耗尽

作者:是龙台呀

原文链接:https://blog.csdn.net/qq_37781649/article/details/120931207

相关推荐

我们经常会遇到这样的问题,从网页或文档中复制文字时,背景色也一并被复制了下来,使得粘贴后的文字难以阅读。那么,如何去掉复制粘贴文字的背景色,让文字更清晰、更易读呢?本文将为你详细解答。 复制粘贴文字的…

当年玩《暗黑破坏神2》最绝望的事是什么呢? 和BOSS拼命之前忘记放回城卷,结果被打死之后还要跑步去捡尸体,一个运气不好被路边一个杂兵又给干死了; 多死了几次之后脑袋一热退出游戏,这下好了,剩下一个没…

我的双胞胎宝宝去年3月出生,妹妹出生后第四天护理阿姨发现妹妹的尿不湿上面有些许血丝,告知护士医生后,妹妹就住进了新生儿科,直到第六天我和哥哥出院,妹妹都还不能出院。 出院后几天,医院打电话来让送母乳,…

爱他美奇迹系列在2020年面世,分别有澳洲版绿罐,以及香港版蓝罐、白罐,奇迹系列走的是高端路线,不少人来后台留言问:爱他美奇迹系列怎么样?有什么区别?哪个更值得买?下面,各位看完我的解读分析就会有答案…

点击右上角“关注”,每天获取职场经验、企业管理知识!轻课CEO,坚持无干货,不分享! 以前中国人称呼生意人的称呼很简单,就是老板。改革开放后,外国公司进入中国后,不但带来了新的经营理念,还带来了全新的…

俗话说“数量重于质量”。但 Dieline 奖 2023 年度最佳工作室得主每年都证明,事实上,您可以同时拥有精心设计的包装和众多奖项。年度最佳工作室颁发给在竞赛中所有类别中获得最多总体胜利的工作室、…

《指鹿为洋》番茄小说甜宠结局he,暗恋 mx 总裁在左手无名指上纹了字母sz 时常盯着发呆,他的朋友调侃着询问道“是女朋友吗?” 语气生成的回答道“不是女朋友,我还没有把她追到手。” 得知女孩要来自己…

【 爱情麻辣烫 】 导演: 张扬 编剧: 刘奋斗 / 刁亦男 / 蔡尚君 / 张扬 / 皮特·洛尔 主演: 高圆圆 / 徐静蕾 / 邵兵 / 濮存昕 / 吕丽萍 / 更多... 类型: 剧情 / 爱情…

马上4月份了,给大家推荐6个值得去的地方,希望你们能喜欢 一、云南.西双版-浪漫的边陲小城 这座边陲小城特别适合情侣闺蜜旅行,穿傣服,做傣妹,万人齐聚泼水狂欢 西双版纳旅游推荐景点 般若寺 很漂亮,最…

自用的TP-Link路由器好几年了,最近三天二头重启才能正常连接。正好手头上有台Buffalo WZR-HP-G450H无线路由器,正好可以替换掉老的TP-Link。 我的教程适合电脑小白和11、12…

《英雄联盟》S5赛季的季前赛如期来临,不少撸友闷头扎进了这场声势浩大的季前赛大军中。每年的LOL季前赛总会有很多的朋友疑惑季前赛的相关问题,比如为什么会有季前赛?我在季前赛中所打的所有比赛对我之后的正…

自从有了内置GPS(全球定位系统)的智能手机,普通人在城市,荒野穿行时不再迷路,如果您认为GPS的功能仅限于此,那就大错特错了。 GPS工作原理图 GPS系统由一组卫星组成,这些卫星将信号发送到地球表…

丹麦王国(丹麦语:Kongeriget Danmark;英语:The Kingdom of Denmark),简称丹麦(Denmark),北欧五国之一,是一个君主立宪国,拥有两个自治领地,法罗群岛和格…

在夸张版的 SmackDown 中,凯文欧文斯被揭露为 Team Brawling Brutes 的第五名成员,这让 The Bloodline 非常懊恼。 此外,Ricochet 和 Butch 获…

一旦宝宝发烧,很多父母都会担心宝宝“烧坏脑子”、“烧出肺炎”,但其实只要宝宝精神状态良好,温度在38.5℃以下,父母可不用过于担心,也不必急于吃药。 一般情况下,如果宝宝发烧不超过38.5℃,父母可以…

阳光,海岸,香车,美人…… 与敞篷跑车联系在一起的词汇总让人浮想联翩。 在普通人的印象里,敞篷跑车总是给人一种昂贵,且遥不可及的感觉。但事实真的如此吗? 根据权威媒体的测评,我们为你介绍四个类别的最佳…

最近,《权力的游戏》中“龙妈”的扮演者在社交平台发布自拍,竟然被一些网友骂又老又丑,年纪大了,全然没了年轻时的美貌。 互联网上因此展开了一场激烈的骂战,有人恶毒评价她的外貌,也有人维护她,双方你来我往…

"啊,我的电脑系统怎么又出故障了!!!"一听到这些长叹,韩博士就知道肯定是这位小伙伴的电脑出现故障问题了。对于这种经常性出现故障问题的小伙伴来说,重装系统应该已经算得上是家常便饭了。不过如果是第一次碰…

在日常生活中,我们经常需要将一些文件在不同设备上进行互传。今天我们主要来讲述两台电脑之间怎么互传文件,小编总结了3点,一起来看看吧! 第一、U盘/硬盘 U盘和硬盘是我们日常使用最多的外接储存设备,也是…

最新一期由佰草集冠名的《出发吧爱情》一向以高战斗值而突出的吴京谢楠夫妇,居然在花前月下上演了一场星月般的浪漫约会。身为武术冠军的吴京不如别的丈夫那般会弹着吉他唱歌送玫瑰,紧张得不能自已。遵循着做自己就…