记 Quartz 定时任务导致内存泄露(OOM)问题

  1. 公司的系统一直运行正常,但是某一天同时反馈采集系统出现了没有办法正常运行的问题。经过查看日志定位到后台报错 OOM

[2025-02-04 18:10:44.497] [] [[34m INFO[0;39m] LocalDataSourceJobStore:968] Handling the first 1 triggers that missed their scheduled fire-time. More misfired triggers remain to be processed.
Creating a new SqlSession
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2d4f8cbc]
Exception in thread "http-nio-8088-ClientPoller-0" Exception in thread "http-nio-8088-ClientPoller-1" java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space

  1. 经过查阅资料: java.lang.OutOfMemoryError : Java heap space 是堆内存溢出,可以通过调大堆内存避免这个问题,但是指标不治本,还得定位到根本的原因。
一般的常见的原因:处理大量数据、加载大文件或者内存泄漏的代码中
系统运行了很久之后才暴露的问题,因而跳过前两种原因,定位到内存泄漏引发的问题。
  1. 我本次是堆内存溢出,经过查询资料,找到大致的解决方案,首先是监控 GC 的动向,启动 jar 包的时候添加相应的指令即可,参考下面的指令:会自动将 GC 日志打印到 gc.log 中
java -Dfile.encoding=utf-8 -Xms1024m -Xmx2048m -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -jar ***.jar
下面是 GC 日志的截图,显示的结果是我应该是解决了内存溢出的问题。我在今天的 11 点 43 分之后重新启动项目发现没有频繁的 GC 打印了。之前都是
1分钟左右一次的GC, 现在好久都没有一次GC
0
  1. 分析过程
① 上面已经说过,启动的时候打印 gc 日志信息。
② 通过 java 自带的 Java VisualVM 监控公交监控项目运行期间的 堆内存占用情况,示例图:
0
③ 当 堆 内存空间占用比较高的时候进行堆内存导出(堆Dump)到 hprof 文件
④ 使用专业的 EMA 分析工具分析 hprof 文件(file -> 打开指定的 hprof 文件,点击下面的 金黄色 的齿轮,可以自动解析:)工具链接(注意按照 jdk 版本进行下载)
 
0
解析的结果注意下面的 Problem Suspect 1 定位具体的问题:
0
比如我的这个就是上面的一个对象里面的 hashmap 对象占用内存过多导致的泄露问题。经过排查是 hashmap 没有做值的释放导致的,经过释放,恢复正常。
posted @   水能载舟亦能载艇  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示