当前位置: 首页 > news >正文

OOM问题排查思路及解决方案

OOM问题原因:

根本原因是创建的对象数量超过JVM堆内存容量,且这些对象无法被GC回收

场景:

1.本地缓存了用户态,用户量急剧上升导致内存溢出,如使用HashMap本地缓存10万用户数据,每	 个用户对象约2KB,导致至少200MB内存占用。
2.编写了死循环向集合添加元素的代码。
3.设计了静态集合但未实现元素清理功能。
4.JVM的堆内存设置太小不足以支撑项目的基本运行环境,如电商系统推荐-Xms4g -Xmx8g,而实际仅配置了-Xms512m -Xmx1g。
5.写了一个动态sql,当条件1是null的时候则查全表,全表数据量很多,导致内存溢出。

排查问题:

加两个jvm参数oom会自动把Dump日志下载下来

-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=/path/to/dump.hprof

这种方式需要等程序出现oom的情况下才能拿到Dump日志,有些场景不适合,例如我就有过一次经历,服务到达一定内存的时候K8S自动重启了对应的服务,这种情况是不会触发oom报错
所以我们就要用以下的方式来处理

间隔一段时间生成两次Heap Dump

jmap -dump:live,format=b,file=heap1.hprof <pid>jmap -dump:live,format=b,file=heap2.hprof <pid>

拿到日志后用工具分析

我这里用的是JDK自带的visualvm,同时也可以用Idea打开Dump日志也可以看到一些数据,我比较习惯用这个visualvm。
我这里是一个正常的dump日志,如果是异常的这里会显示哪个对象占用内存太多及对应的占用比例
在这里插入图片描述
这里还可以看到一些线程的信息,看到是哪里创建的这个对象,就可以找到对应的代码了
在这里插入图片描述
在这里插入图片描述

http://www.dtcms.com/a/351614.html

相关文章:

  • 【Notepad++免费版下载安装教程(附安装包)2025最新整理】
  • 如何用Wireshark捕获当前房间路由器和主机的数据包
  • iOS 26 正式版即将发布,Flutter 完成全新 devicectl + lldb 的 Debug JIT 运行支持
  • 剖析graph-rag中最核心的一步:切片文本如何输入到大模型并且构建整体的关系
  • 食用油平台:油香里的生活哲学课
  • 使用 Vue 3 <script setup> 语法实现基于 token 的登录功能
  • 100种交易系统(4)顺势回调开仓
  • android多线程与线程间通信
  • python-多线程(笔记)(持续更新)
  • 基于dify+ollama+bge组合搭建本地知识库
  • 10分钟快速搭建 SkyWalking 服务
  • 【Apache MXNet】
  • Med-SA 论文总结
  • Apache Shiro基本使用指南
  • 基于SpringBoot的社团管理系统【2026最新】
  • 《C++ Primer 第五版》initializer_list 涉及到的范围 for 循环(range-based for) 的语义差别
  • 车载铁框矫平机:把“钣金诊所”开到工地上
  • 【软考论文】论原型开发方法及其应用
  • Ubuntu 24.04 LTS 桌面版安装问题记录
  • 2025年8月27日,七月初五,生活指南
  • Python包管理与安装机制详解
  • pytorch-利用letnet5框架深度学习手写数字识别
  • 漫谈《数字图像处理》之霍夫变换发展历程与演进脉络
  • 类似ant design和element ui的八大Vue的UI框架详解优雅草卓伊凡
  • (vue)el-progress左侧添加标签/名称
  • C++学习(4)模板与STL
  • 虚幻5引擎:我们是在创造世界,还是重新发现世界?
  • 8.26 review
  • 【大前端】React统计所有网络请求的成功率、失败率以及统一入口处理失败页面
  • Ubuntu22.04安装OBS