Out of memory error : GC overhead limit exceeded
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相关推荐
- IDEA mvn 报错GC overhead limit exceeded
在idea中添加maven的构建命令,执行的时候报错:[ERROR] GC overhead limit exceeded -> [Help 1] 这是因为项目太大了,mvn在执行过程中内存不够 ...
- An internal error occurred during: Retrieving archetypes:. GC overhead limit exceeded
An internal error occurred during: "Retrieving archetypes:".GC overhead limit exceeded 异常, ...
- 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 ...
- java.lang.OutOfMemoryError:GC overhead limit exceeded填坑心得
该文章出自:http://www.cnblogs.com/hucn/p/3572384.html 分析工具:http://www.blogjava.net/jjshcc/archive/2014/03 ...
- 一次OutOfMemoryError: GC overhead limit exceeded
现象: 由于需要将mysql表中的过期数据在凌晨定时读取出过滤后转入到MongoDB,一个转换SQL达到百行,而且有几十个,集中运行后程序反馈异常: Handler dispatch failed; ...
- java.lang.OutOfMemoryError:GC overhead limit exceeded
我遇到这样的问题,本地部署时抛出异常java.lang.OutOfMemoryError:GC overhead limit exceeded导致服务起不来,查看日志发现加载了太多资源到内存,本地的性 ...
- java.lang.OutOfMemoryError: GC overhead limit exceeded
今天现场weblogic报java.lang.OutOfMemoryError: GC overhead limit exceeded,在metalink查了下,有明白解释,要设置一个JVM參数.只是 ...
- idea启动java服务报错OutOfMemoryError: GC overhead limit exceeded解决方法
在用idea开发java项目时,启动报内存溢出错误,致服务启动失败: Error:java: java.lang.OutOfMemoryError: GC overhead limit exceede ...
- Spark读取HDFS上的Snappy压缩文件所导致的内存溢出问题 java.lang.OutOfMemoryError: GC overhead limit exceeded
报错java.lang.OutOfMemoryError: GC overhead limit exceeded HDFS上有一些每天增长的文件,使用Snappy压缩,突然某天OOM了 1.原因: 因 ...
最新文章
- WebSpider的编码问题(乱码)浅析
- java多线程解决应用挂死的问题
- python 曲线多项式拟合
- mysql scws_php利用scws实现mysql全文搜索功能的方法,_PHP教程
- Selinux安全上下文详解
- JAVA入门级教学之(内存引用的例子)
- python opencv2_Python + OpenCV2 系列:2 - 图片操作
- CSS3: 利用分层动画让元素沿弧形路径运动
- Exchange 2007 删除 某时间段 特定主题 的邮件
- 什么是WAP?wap技术简介(转)
- 作为股权类投资人,我们的投资偏好和投资原则
- PIC16F877A与Proteus仿真-1位7段数码管驱动
- Unity优化☀️光照烘焙
- 使用java调用阿里云车牌识别API
- Vue中的keep-alive组件
- 中水处理设备可提高水资源利用率说明
- 【sqlplus】SQL*Plus命令使用大全
- RDLC报表 报表数据(参数栏)不显示怎么办?
- 数据结构严蔚敏代码合集 严书数据结构代码实现 可直接运行 持续更新by myself
- 怎样用css3设计出向上向下的小箭头