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内存就爆了。

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

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

 

posted @ 2023-07-03 11:20  迷神图卷  阅读(79)  评论(0编辑  收藏  举报