GC overhead limit exceeded 是指垃圾回收器通过分析当前内存使用趋势,提前抛出异常而不是真正等到内存耗尽再抛出异常。如果真正等到内存耗尽再抛出异常,可能的后果是:我们连保存重要数据的空间都没了。

那么GC是如何分析内存使用趋势来决定是否跑出此异常呢? 默认情况下, 如果内存使用量达到一个阈值之后,GC花费的时间超过 98%, 并且GC回收的内存少于 2%,JVM就会抛出异常。也就是说,GC发现“内存将尽,大厦将倾”,而自己“鞠躬尽瘁”,“费力不讨好”,总做“无用功”的时候,GC就会抛出异常。

明白了异常发生的原理,我们很容易“制造”异常来模拟“车祸”现场。下面的代码随机生成字符串,并把字符串添加到列表。因为这些新创建的字符串无法被GC回收,在内存溢出之前,GC就率先抛出异常了。

运行这段程序使用-Xmx12m参数,把堆设的小一些效果更明显。

package wyf.clonesite;import java.util.ArrayList;
import java.util.List;
import java.util.Random;public class BugShooter {
String randomString() {StringBuilder builder = new StringBuilder();Random r = new Random();for (int i = 0; i < 30; i++) {builder.append(r.nextInt(100));}return builder.toString();
}BugShooter() {int cnt = 0;try {List<String> a = new ArrayList<>();while (true) {cnt++;a.add(randomString());if (cnt % 1000 == 0) System.out.println(cnt);}} catch (Exception e) {e.printStackTrace();System.out.println(cnt);}
}public static void main(String[] args) {new BugShooter();
}
}

异常内容如下:

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceededat java.util.Random.<init>(Random.java:137)at java.util.Random.<init>(Random.java:105)at wyf.clonesite.BugShooter.randomString(BugShooter.java:10)at wyf.clonesite.BugShooter.<init>(BugShooter.java:23)at wyf.clonesite.BugShooter.main(BugShooter.java:33)

GC提前抛出异常看的是内存使用的“速度”,而内存溢出看的是内存使用的“路程”。速度如果太快,GC就认为很危险。

实际中,我们可能确实会有大量开辟不可回收对象的场景,那么如何解决这个问题呢?

  • 下策:关闭GC提前抛出异常的机制,使用-XX:-UseGCOverheadLimit
  • 中策:捕捉此异常,在内存耗尽之前dump程序状态,备份好数据,坦然“就义”
  • 上策:加大堆空间-Xmx1024m

参考资料

https://blog.csdn.net/renfufei/article/details/77585294
https://blog.csdn.net/evilcry2012/article/details/79063822

转载于:https://www.cnblogs.com/weiyinfu/p/9815410.html

Out of memory error : GC overhead limit exceeded相关推荐

  1. IDEA mvn 报错GC overhead limit exceeded

    在idea中添加maven的构建命令,执行的时候报错:[ERROR] GC overhead limit exceeded -> [Help 1] 这是因为项目太大了,mvn在执行过程中内存不够 ...

  2. An internal error occurred during: Retrieving archetypes:. GC overhead limit exceeded

    An internal error occurred during: "Retrieving archetypes:".GC overhead limit exceeded 异常, ...

  3. What means the error-message 'java.lang.OutOfMemoryError: GC overhead limit exceeded' in Java?

    转国内的: 一.异常如下:Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exce ...

  4. java.lang.OutOfMemoryError:GC overhead limit exceeded填坑心得

    该文章出自:http://www.cnblogs.com/hucn/p/3572384.html 分析工具:http://www.blogjava.net/jjshcc/archive/2014/03 ...

  5. 一次OutOfMemoryError: GC overhead limit exceeded

    现象: 由于需要将mysql表中的过期数据在凌晨定时读取出过滤后转入到MongoDB,一个转换SQL达到百行,而且有几十个,集中运行后程序反馈异常: Handler dispatch failed; ...

  6. java.lang.OutOfMemoryError:GC overhead limit exceeded

    我遇到这样的问题,本地部署时抛出异常java.lang.OutOfMemoryError:GC overhead limit exceeded导致服务起不来,查看日志发现加载了太多资源到内存,本地的性 ...

  7. java.lang.OutOfMemoryError: GC overhead limit exceeded

    今天现场weblogic报java.lang.OutOfMemoryError: GC overhead limit exceeded,在metalink查了下,有明白解释,要设置一个JVM參数.只是 ...

  8. idea启动java服务报错OutOfMemoryError: GC overhead limit exceeded解决方法

    在用idea开发java项目时,启动报内存溢出错误,致服务启动失败: Error:java: java.lang.OutOfMemoryError: GC overhead limit exceede ...

  9. Spark读取HDFS上的Snappy压缩文件所导致的内存溢出问题 java.lang.OutOfMemoryError: GC overhead limit exceeded

    报错java.lang.OutOfMemoryError: GC overhead limit exceeded HDFS上有一些每天增长的文件,使用Snappy压缩,突然某天OOM了 1.原因: 因 ...

最新文章

  1. WebSpider的编码问题(乱码)浅析
  2. java多线程解决应用挂死的问题
  3. python 曲线多项式拟合
  4. mysql scws_php利用scws实现mysql全文搜索功能的方法,_PHP教程
  5. Selinux安全上下文详解
  6. JAVA入门级教学之(内存引用的例子)
  7. python opencv2_Python + OpenCV2 系列:2 - 图片操作
  8. CSS3: 利用分层动画让元素沿弧形路径运动
  9. Exchange 2007 删除 某时间段 特定主题 的邮件
  10. 什么是WAP?wap技术简介(转)
  11. 作为股权类投资人,我们的投资偏好和投资原则
  12. PIC16F877A与Proteus仿真-1位7段数码管驱动
  13. Unity优化☀️光照烘焙
  14. 使用java调用阿里云车牌识别API
  15. Vue中的keep-alive组件
  16. 中水处理设备可提高水资源利用率说明
  17. 【sqlplus】SQL*Plus命令使用大全
  18. RDLC报表 报表数据(参数栏)不显示怎么办?
  19. 数据结构严蔚敏代码合集 严书数据结构代码实现 可直接运行 持续更新by myself
  20. 怎样用css3设计出向上向下的小箭头

热门文章

  1. ES6--Decorator修饰器
  2. c语言学习笔记 关于double
  3. 执行NET 命令无法使用超过20个字符的组名或用户名
  4. C/C++ 中的指针
  5. SQLServer数据库字典维护方法
  6. Linux学习笔记13--使用mount命令挂载CDROM
  7. 《菜菜的机器学习sklearn课堂》学习笔记 + 课件
  8. element 让日期选择器一直显示选择面板
  9. OpenBSD同步时间
  10. 看完本文若不能让你学通“Python”,我将永远退出IT界