java.lang.OutOfMemoryError: GC overhead limit exceeded问题分析及解决

这篇具有很好参考价值的文章主要介绍了java.lang.OutOfMemoryError: GC overhead limit exceeded问题分析及解决。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、错误重现

2022-12-29 10:12:07.210 ERROR 73511 --- [nio-8001-exec-6] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.OutOfMemoryError: GC overhead limit exceeded] with root cause

java.lang.OutOfMemoryError: GC overhead limit exceeded

出现该问题的原因:当GC为释放很小空间占用大量时间时会抛出此异常,即(Sun 官方对此的定义,超过98%的时间用来做GC并且回收了不到2%的堆内存时会抛出此异常)。一般是因为堆太小,导致异常的原因:没有足够的内存。

对于该项目我的启动命令如下:堆内存空间开辟的是256m

nohup java -Xms256m -Xmx256m -Dspring.profiles.active=test -jar ...

在数据量没有巨量增加的时候该对内存空间是足够的,因为我们的文件基本都在1m以内,所以开辟的内存空间也足够,但是后来由于算法业务的变化,数据量直接达到了50m多,因此就出现了上面的OOM的情况,在一次请求的情况下YGC就达到了81次,FGC达到了51次。具体信息如下:

java.lang.outofmemoryerror: gc overhead limit exceeded,JVM调优,JVM堆空间开辟依据,线上OOM问题分析与排查,线上OOM解决思路

二、问题分析

其实出现OOM的情况很多,今天主要就我这种情况进行一个简单的分析,该错误信息:

java.lang.OutOfMemoryError: GC overhead limit exceeded

当然出现该问题的主要原因在于:项目启动的时候堆内存空间分的不够,不过我们也能够从自身的代码做一些优化,比如说:可以让处理数据的过程变得更加简单一下,不要有过多的内存开销情况,这种情况也是要对JVM启动参数进行重新调整;另一个方面我们可以直接从JVM分配堆内存的角度进行优化,当然需要对我们的业务了解后,将项目做一个业务模型的提炼,然后分析该模型的内存开销情况,根据分析的内存开销情况对JVM内存做出预判。

三、问题解决

我们在清楚了问题的情况下,接下来主要分享解决问题的过程,其实这里很多人可能会问,我们对JVM的内存开辟主要依据是什么?到底这个内存开辟多少合适?

我个人认为这个问题的关键在于我们对系统主要业务的了解,然后对主要业务流程建立业务模型,再对业务模型的请求数据量做大概的估算,即便是具有高并发的系统也是如此方法计算。下面就拿我们的系统来打比方:我们的系统模型中内存开销最多的情况在于用户数据的导入+算法计算后的数据量,这样一来我们就可以计算出该模型中一次请求大概的内存开销。如果有高并发,在计算出每秒钟有多少次这样的请求,这样就很容易计算出JVM启动的内存大概开辟多少合适。当我调整后启动命令如下:

nohup java -Xms1024m -Xmx1024m -Dspring.profiles.active=test -jar ...

我这个系统demo计算的依据在于:

1、该系统中消耗内存最大的地方是:用户导入数据+算法计算后数据的处理;

2、该系统的算法计算后数据大概在50m多,这里也就是说一个请求过来我数据量占用的内存就要达到50m;

3、该次请求中其它内存消耗估算在50m,因为用户导入数据也非常耗费内存;

4、当然还有很多的增删改查操作:估算在100m;

5、最后在我们计算出来的主要开销情况下扩大5到10倍。

所以我就单台服务器开辟JVM内存空间在1024m,在正常情况下还是没有问题的。

这里非常明显能够看到YGC进行了41次,FGC进行了0次:

java.lang.outofmemoryerror: gc overhead limit exceeded,JVM调优,JVM堆空间开辟依据,线上OOM问题分析与排查,线上OOM解决思路

四、总结

其实平时我们学习再多的理论知识,不如一次生产实践中遇到一次问题带来的收获多。当然这里分享的如有错误还望指出,只有这样才能不断的进步。

参考文档:Java OOM 基础篇:常见的OutOfMemoryError 场景二 : GC overhead limit exceeded 问题详解 | HeapDump性能社区文章来源地址https://www.toymoban.com/news/detail-809900.html

到了这里,关于java.lang.OutOfMemoryError: GC overhead limit exceeded问题分析及解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • com.github.oshi-3.9.1 java.lang.OutOfMemoryError: GC overhead limit exceeded 排查思路

    1.Disabling the error check altogether, via “-XX:-UseGCOverheadLimit”. 此种方式最终会改报错为java.lang.OutOfMemoryError: Java heap space(治标不治本) 2.增大堆内存。既然堆内存少了,那就增加堆内存即可,-Xms64M -Xmx64M  ,如果存在内存泄漏,那还是治标不治本    3.优化内存泄漏的代码(终极

    2024年02月03日
    浏览(48)
  • Windows下运行Tomcat服务时报GC Overhead Limit Exceeded

    根本原因是在新建Tomcat作为Windows服务时,系统默认设置的堆内存太小了,我们打开/bin/service.bat文件,将如下图所示的默认值改大一些就好了 然后我们删除掉原来创建的Tomcat服务,重新创建依次Tomcat服务即可

    2024年02月13日
    浏览(38)
  • idea maven 打包 内存溢出 报 GC overhead limit exceeded -> [Help 1]

    idea 使用maven打包 报GC overhead limit exceeded - [Help 1] 解决方法: 打开settings - 点开如同所示 将 vm Options 参数 设为 -Xmx8g 

    2024年04月10日
    浏览(45)
  • spark报出An error occurred while calling o209.showString.和GC overhead limit exceeded的解决方法

    如下图的错误解决方法 出现该错误的原因是因为迭代处理的数据量太大,jvm的自动回收垃圾机制不完善导致的,比如我在这里对2千万的数据迭代处理24次,数据就报错了。 解决方法一:可以利用isin函数代替24次迭代过程 改为 在这里提一句 这一句的作用是把zt列,值为开业的

    2024年02月08日
    浏览(40)
  • [hive]return code -101 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask. GC overhead limit exceeded

    [2022-11-10 10:21:31] [08S01][-101] Error while processing statement: FAILED: Execution Error, return code -101 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask. GC overhead limit exceeded 一般map读取一个片的数据不会内存不够,所以: 1、调大reduce个数 2、group by 数据倾斜 3、使用大的队列

    2024年02月12日
    浏览(35)
  • 分析和解决java.lang.OutOfMemoryError: Java heap space问题

    最近客户反馈在生产环境导入操作时遇到任务一直执行中,并且入库的数据量一直不改变。通过日志查询,终于定位到报错信息如下: java.lang.OutOfMemoryError: Java heap space (JVM 堆空间溢出)简单来说就是在创建新的对象时, 堆内存中的空间不足以存放新创建的对象,导致此种问题

    2024年02月05日
    浏览(53)
  • 解决idea出现的java.lang.OutOfMemoryError: Java heap space的问题

    今天使用 idea 开发时,突然报出如下错误:

    2023年04月19日
    浏览(48)
  • java.lang.OutOfMemoryError- unable to create new native thread 问题排查

    最近连续两天大约凌晨3点,线上服务开始异常,出现OOM报错。且服务所在的物理机只能ping通,但是无法登录。报错信息如下: 根据日志OOM报错,怀疑是内存不足或内存泄露的原因,需要查看内存的使用情况。考虑到 JConsole 或 VisualVM 具有可视化界面,能看出历史变化趋势,

    2023年04月13日
    浏览(95)
  • Flink 运行错误 java.lang.OutOfMemoryError: Direct buffer memory

    如遇到如下错误,表示需要调大配置项 taskmanager.memory.framework.off-heap.size 的值,taskmanager.memory.framework.off-heap.size 的默认值为 128MB,错误显示不够用需要调大。 2022-12-16 09:09:21,633 INFO  [464321] [org.apache.hadoop.security.UserGroupInformation.initialize(UserGroupInformation.java:366)]  - Hadoop UGI auth

    2024年02月03日
    浏览(52)
  • es内存溢出启动报错java.lang.OutOfMemoryError: Java heap space

    问题: es容器自己停止,重启之后启动失败,报错如下: 原因: 容器中es由于数据量过大,超过了elasticsearch进程的最大内存量,elasticsearch 会将启动脚本中的JAVA_OPTS 选项传递给 JVM 来启动elasticsearch. 其中最重要的一个参数是 -Xmx ,此参数用于控制系统分配给elasticsearch 进程的

    2023年04月14日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包