OutOfMemoryError: Java heap space/GC overhead limit exceeded 内存溢出问题排查

一、背景

我开发的给产线使用的工具时不时就无法登录,查看日志基本上都是内存溢出,查看实际内存基本上都占满了JVM设置的内存大小

导致的现象就是SpringBoot项目无法登录,导致系统不可用。

下面是我的java启动设置。

javaw -Xmx6G -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:/java_heapdump.hprof -jar D:/CODE/FEBS-Shiro-2.0.jar --server.port=8080 --spring.profiles.active=prod 

二、排查经过

内存泄漏问题通过百度可知,需要使用jmap之类的工具将内存状态导出,然后使用eclipseMat工具进行分析。

工具使用参考Eclipse MAT内存分析工具(Memory Analyzer Tool)_eclipsemat_zhousenshan的博客-CSDN博客

通过下面的方式启动jar包,可以在内存溢出的时候将JVM内存状态保存到文件中。

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:/java_heapdump.hprof

事后通过eclipseMat工具打开java_heapdump.hprof文件进行分析。

由于内存溢出时,我的生产环境设置的JVM是6G,所以排查问题的事后eclipseMAT也需要将JVM设置成6G

首次运行eclipseMAT的时候提示需要使用java17,下面是eclipseMAT的配置文件设置

-startup
plugins/org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar
-vm
D:\Java\jdk-17.0.7\bin\javaw.exe  //需要到oracle官网下载jdk17的zip版,然后解压到本地,这样不会影响我使用JDK1.8
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.2.700.v20221108-1024
-vmargs
--add-exports=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED
-Xmx6G//这里设置成自己的内存溢出文件java_heapdump.hprof的大侠,我的文件大小差不多5G所以我设置成6G

打开文件后发现有一个类型的对象占用大量的堆栈

通过查询分析项目代码

发现有一个查询表记录并返回LIST的代码有内存泄漏的风险,修改之前,假如DMC为空,就会查询表里的所有数据,该表有800万的记录,大概查询到160万左右的时候6G的JVM内存就爆了。

增加限制代码,假如没有输入查询条件,则指定一个固定值。

 同时横向排查同类型的代码,彻底解决内存泄漏的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值