令人头痛的java.lang.OutOfMemoryError:GC overhead limit exceeded

本文详细解析了java.lang.OutOfMemoryError:GCoverheadLimitExceeded错误,通过jmap和jvisualvm工具定位线上HashMap异常,提供了解决方案,包括重启服务器、增大堆内存和代码审查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

jmap+jvisualvm 分析系统中的 java.lang.OutOfMemoryError:GC overhead limit exceeded

2019-11-21 星期六、一大早一个钉钉的语音通知工单系统挂了。
马上洗漱完跑到公司,打开远程服务器看了一下报错信息!

java.lang.OutOfMemoryError:GC overhead limit exceeded

???内存溢出
首先重启一下服务器(心想这个可能是偶发性吧估计谁在做什么比较消耗资源的东西,想着重启这一下就能解决)

五分钟过后又报出了GC overhead limit exceeded,看了一下服务器内存确实不够,但是平时

接着百度一下GC overhead limit exceeded,有文章解释道:

这个是JDK6新添的错误类型。是发生在GC占用大量时间为释放很小空间的时候发生的,是一种保护机制。一般是因为堆太小,导致异常的原因:没有足够的内存。
Sun 官方对此的定义:超过98%的时间用来做GC并且回收了不到2%的堆内存时会抛出此异常。

解决方案

  1. 查看代码中是否有死循环;
  2. 增大堆内存
    JAVA_OPTS=-server -Xms512m -Xmx1024m -XX:MaxNewSize=1024m -XX:MaxPermSize=1024m ;
  3. 清除linux 缓存
    echo 3 > /proc/sys/vm/drop_caches

上面的方案全试了一遍之后,问题依旧没解决
最后使用 jmap 生成dump 文件,用jvisualvm 分析之后成功定位问题。

一. jmap 成功dump文件

##pid 为项目进程id   /mnt/oom.phrof 为文件路径
jmap -dump:format=b,file=/mnt/oom.phrof  pid

如果上方提示jmap命令不存在使用java命令which java获取jdk的安装路径

which java
## 进入上面输出的jdk安装路径
cd /usr/local/java/jdk/jdk1.8/bin/
./jmap -dump:format=b,file=/mnt/oom.phrof pid

二. 下载dump文件到本地

## 首先压缩一下dump文件(文件太大压缩过后下载更快)
zip oom2.zip /mnt/oom.phrof
## 下载
sz /mnt/oom.phrof

三.使用jvisualvm 打开dump文件

解压下载下来的oom2.zip 得到oom.phrof 文件
双击打开本地jdk的bin目录下的jvisualvm.exe,点击菜单-文件->装入oom.phrof

在这里插入图片描述

对比发现线上的HashMap的示例数异常,找了最近提交的代码 发现了这个bug
在这里插入图片描述

### 解决 IntelliJ IDEA 中 'java.lang.OutOfMemoryError: GC overhead limit exceeded' 当开发人员在使用 IntelliJ IDEA 进行 Java 开发时,可能会遇到 `java.lang.OutOfMemoryError: GC overhead limit exceeded` 错误。此错误通常表示垃圾回收器花费了过多的时间来尝试释放内存,但只恢复了一小部分可用空间[^1]。 #### 调整 JVM 的堆大小设置 可以通过修改 IDE 或运行项目的 JVM 参数来增加分配给应用程序的内存。以下是具体方法: 1. **调整 IntelliJ IDEA 自身的内存配置** 修改文件 `idea64.exe.vmoptions`(Windows/Linux 上位于 `<IDEA安装目录>/bin/` 文件夹下),或者 macOS 用户可以找到该文件路径为 `/Applications/IntelliJ\ IDEA.app/Contents/bin/idea.vmoptions`。 将以下参数加入到上述文件中: ```properties -Xms512m -Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError ``` 此处 `-Xms` 和 `-Xmx` 分别定义最小和最大堆内存大小。可以根据实际需求进一步增大这些数值以适应更大的项目规模[^2]。 2. **针对特定模块或应用调整内存** 如果仅希望更改某个 Maven 或 Gradle 构建的任务内存限制,则可以在其对应的构建工具配置里指定额外选项。例如,在 Maven 配置窗口中的 VM options 字段输入如下命令: ```bash -Xmx2g ``` 3. **禁用不必要的插件和服务** 关闭那些不使用的功能组件以及第三方扩展程序能够有效减少整体资源消耗。通过菜单栏依次点击 File -> Settings -> Plugins 来管理已加载项列表[^3]。 4. **优化代码结构与数据处理逻辑** 对于某些极端情况下的 OOM 问题,可能还需要重新审视业务实现方式是否存在潜在缺陷。比如循环引用对象未及时清理、大量临时变量占用过久等问题均可能导致此类异常发生。 ```python def optimize_memory_usage(): """ A function demonstrating how to manage memory usage effectively. This is a conceptual example and may not directly apply here but serves as guidance on best practices. """ large_list = [] try: while True: # Simulate adding elements into the list until system runs out of memory pass except MemoryError: print("Caught an OutOfMemory situation!") optimize_memory_usage() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值