- 公司的系统一直运行正常,但是某一天同时反馈采集系统出现了没有办法正常运行的问题。经过查看日志定位到后台报错 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
- 经过查阅资料: java.lang.OutOfMemoryError : Java heap space 是堆内存溢出,可以通过调大堆内存避免这个问题,但是指标不治本,还得定位到根本的原因。
一般的常见的原因:处理大量数据、加载大文件或者内存泄漏的代码中
系统运行了很久之后才暴露的问题,因而跳过前两种原因,定位到内存泄漏引发的问题。
- 我本次是堆内存溢出,经过查询资料,找到大致的解决方案,首先是监控 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](https://img2024.cnblogs.com/blog/1411009/202502/1411009-20250212162846706-1857009358.png)
- 分析过程
① 上面已经说过,启动的时候打印 gc 日志信息。
② 通过 java 自带的 Java VisualVM 监控公交监控项目运行期间的 堆内存占用情况,示例图:
![0](https://img2024.cnblogs.com/blog/1411009/202502/1411009-20250212162846520-1194834883.png)
③ 当 堆 内存空间占用比较高的时候进行堆内存导出(堆Dump)到 hprof 文件
④ 使用专业的 EMA 分析工具分析 hprof 文件(file -> 打开指定的 hprof 文件,点击下面的 金黄色 的齿轮,可以自动解析:)工具链接(注意按照 jdk 版本进行下载)
![0](https://img2024.cnblogs.com/blog/1411009/202502/1411009-20250212162846612-1655323676.png)
解析的结果注意下面的 Problem Suspect 1 定位具体的问题:
![0](https://img2024.cnblogs.com/blog/1411009/202502/1411009-20250212162846505-142880742.png)
比如我的这个就是上面的一个对象里面的 hashmap 对象占用内存过多导致的泄露问题。经过排查是 hashmap 没有做值的释放导致的,经过释放,恢复正常。