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

news2024/9/24 15:20:55

一、错误重现

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次。具体信息如下:

二、问题分析

其实出现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 OOM 基础篇:常见的OutOfMemoryError 场景二 : GC overhead limit exceeded 问题详解 | HeapDump性能社区

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/131841.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL刷题宝典-MySQL速通力扣困难题

📢作者: 小小明-代码实体 📢博客主页:https://blog.csdn.net/as604049322 📢欢迎点赞 👍 收藏 ⭐留言 📝 欢迎讨论! 本手册目录: 文章目录前言Markdown导入数据库python脚…

奇安信 工业互联网安全发展与实践 报告 学习笔记一 欢迎扶正

声明 本文是学习2021工业互联网安全发展与实践分析报告. 下载地址而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 主要观点 工业系统安全漏洞数量增长显著放缓,但超高危漏洞数量却大幅增加。统计显示,2021年,国内外…

Linux 软件包管理器 yum

1.什么是软件包 在Linux下安装软件,一个通常的办法是下载到程序的源代码,并进行编译,得到可执行程序。但是这样太麻烦了,于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上&…

再见2022

大家好,我是bigsai,好久不见。看了上一篇更新时间,大概已经停更近10个月(呜呜后面还会坚持的),在2022的最后一天,这一篇也算是对这一年做个总结。期间也收到一些朋友的问候和鼓励,确实自己在读研期间的前两…

山东大学2022-2023非关系型数据库(Nosql)期末考试

写在前面的话: 今年线上开卷考试,Nosql考试软工(限选课)和大数据(必修课)是一套试题,因此大数据所学的许多内容考试并无涉及。考察点主要以学过的四类Nosql数据库的相关知识为主。 试题如下&…

引用量超1400的经典语义分割方法BiSeNet解读

今天给大家分享语义分割领域非常经典的一篇论文:BiSeNet,该论文发表在了ECCV2018上,引用量超过1400。 开源代码地址:https://github.com/ycszen/TorchSeg 1.动机 语义分割任务,即为图片的每个像素分配一个标签&#…

嵌入式 程序调试之gdb+gdbserver+vscode可视化调试

嵌入式 程序调试之gdbgdbservervscode可视化调试 一、简述 记--使用过visual studio的都知道,它的单步调试真的好用,可以直接在源码下断点,实时查看内存变量、寄存器等相关信息。嵌入式linux开发多用的是gdb, 都是命令行执行的,毕…

python特殊数据类型应用(1)字典类型

目录python中特殊数据类型应用(1)字典类型字典类型定义字典类型注意事项字典类型的访问python中特殊数据类型应用(1)字典类型 python作为最流行的几种开发语言之一,在数据类型上和传统的c、c和java等有很大的不同&…

Typora使用方法

自用,有错误请谅解 tpora破解版使用学习使用: 链接:https://pan.baidu.com/s/1Wj46k3iVIzr-7kwQstp9nQ 提取码:2sa8 来源教程网址:Typora一款 Markdown 编辑器和阅读器 记得更改图片位置,以后就是相对路径…

babel及其使用

什么是Babel? Babel 是一个工具链,由大量的工具包组成,接下来我们逐步了解。主要用于将 ECMAScript 2015 版本的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其他环境中。 核心库 babel/core B…

‘this’不能用于常量表达式错误(C++)【问题解决】

目录 一、报错问题 1、代码 test.h test.cpp 2、问题描述 二、网上解决思路 三、解决方案 【元旦快乐🌹,新年快乐🎉】 最近在编译程序时出现了“ ‘this’不能用于常量表达式错误(C )”的报错问题,查阅多位博主写的文章后&…

mysql 性能优化

mysql 调优可以从这个四个方面来看 1.性能监控 1.1 show profile for query n 查看具体的sql语句各阶段执行时间 show profiles; show profile for query n; 1.2 performance schema 监控mysql 整个服务器中发生的各种事件。 performance schema 表中的数据不会持久化的磁…

一文搞定垃圾回收的三色标记法

我们之前介绍了各种常见垃圾回收器的基本原理,本小节我们讨论一个更深入的问题——垃圾回收器的底层是如何做的。 在并发标记的过程中,因为标记期间应用线程还在继续跑,对象间的引用可能发生变化,多标和漏标的情况就有可能发生。…

计算机视觉(CV)领域Transformer最新论文及资源整理分享

Transformer由论文《Attention is All You Need》提出,现在是谷歌云TPU推荐的参考模型。Transformer模型最早是用于机器翻译任务,当时达到了SOTA效果。Transformer改进了RNN最被人诟病的训练慢的缺点,利用self-attention机制实现快速并行。并…

梯度,GD梯度下降,SGD随机梯度下降

前言 羊了,但是依旧生龙活虎。补补之前落下的SGD算法,这个在深度学习中应用广泛。 梯度(Gradient) 方向导数 在梯度之前,非常重要一个概念:方向导数,这里uuu是nnn维向量,代表一个…

EMNLP 22:Bi-Directional Iterative Prompt-Tuning for Event Argument Extraction

总结 文中的前向和后向的思想可以借鉴下。 但总的来看,似乎是通过前向和后向来做的ensemble操作,虽然是在一个模型下,但同时前向和后向概率保证,可能能够使得预测更准确。 任务形式:event argument extraction (EAE)…

Java 读取resources下的文件+读取resource文件/路径

Java 读取resources下的文件 文档来源 三种实现方式 pom.xml <!-- commons-io io的工具包 --> <dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency>…

SSM之Spring(二)

目录 2.3 基于注解管理bean 2.3.1 标记与扫描 2.3.2 基于注解的自动装配 三&#xff1a;AOP 3.1 场景模拟 3.1.1 声明接口 3.1.2 创建实现类 3.1.3 创建带日志功能的实现类 3.1.4 提出问题 3.2 代理模式 3.2.1 概念 3.2.2 静态代理 3.2.3 动态代理 3.2.4 测试 3.3 AO…

ElasticSearch笔记

ELASTICSEARCH笔记 1、安装elastic search dokcer中安装elastic search &#xff08;1&#xff09;下载ealastic search和kibana docker pull elasticsearch:7.6.2 docker pull kibana:7.6.2&#xff08;2&#xff09;配置 mkdir -p /mydata/elasticsearch/config 创建目…

Hex程序烧写到单片机

一、创建一个Keil代码工程 1、在电脑F盘&#xff08;哪个盘可以随意选择&#xff09;上创建项目工程文件夹Template 2、在Template文件中&#xff0c;创建一个main.c文件 3、进入keil主页面&#xff0c;工具栏project---->New uVision project---->选则第一步的工程文…