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 exceeded
at 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
Out of memory error : GC overhead limit exceeded的更多相关文章
- [Hadoop] - Hadoop Mapreduce Error: GC overhead limit exceeded
在运行mapreduce的时候,出现Error: GC overhead limit exceeded,查看log日志,发现异常信息为 2015-12-11 11:48:44,716 FATAL [m ...
- troubleshooting-sqoop mysql导入hive 报:GC overhead limit exceeded
Halting due to Out Of Memory Error...18/09/13 21:42:17 INFO mapreduce.Job: Task Id : attempt_1536756 ...
- sqoop import mysql to hive table:GC overhead limit exceeded
1. Scenario description when I use sqoop to import mysql table into hive, I got the following error: ...
- JVM--你常见的jvm 异常有哪些? 代码演示:StackOverflowError , utOfMemoryError: Java heap space , OutOfMemoryError: GC overhead limit exceeded, Direct buffer memory, Unable_to_create_new_native_Thread, Metaspace
直接上代码: public class Test001 { public static void main(String[] args) { //java.lang.StackOverflowErro ...
- android studio Error:java.lang.OutOfMemoryError: GC overhead limit exceeded
android studio Error:java.lang.OutOfMemoryError: GC overhead limit exceeded 在app下的build.gradle中找到and ...
- eclipse一直报An internal error occurred during: "Building workspace". GC overhead limit exceeded
最近导入到eclipse里的工程挺大的,每次eclipse启动之后都回update workspace,然后就一直报: An internal error occurred during: " ...
- eclipse:An internal error occurred during: "Build Project". GC overhead limit exceeded
在使用Eclipse的Build Project功能时,提示以下错误: An internal error occurred during: "Build Project". GC ...
- An internal error occurred during: "Retrieving archetypes:". GC overhead limit exceeded
An internal error occurred during: "Retrieving archetypes:".GC overhead limit exceeded 异常, ...
- oozie: GC overhead limit exceeded 解决方法
1.异常表现形式 1) 提示信息 Error java.lang.OutOfMemoryError: GC overhead limit exceeded 2)提示出错 Erro ...
随机推荐
- ListPopupWindow 列表弹窗 常见弹窗区别
案例 private void showPopupWindow(final Context context, @NonNull View anchorView) { final String[] po ...
- SQL SERVER CXPACKET-Parallelism Wait Type 的惯用解决方案
最近我的两个库出现,出现较多的CXPACKET等待,在网上找了一下资料.其中有篇一个SQL Server专栏作家的文章不错,也解决了我的一些疑问,就翻译在这里. 翻译整理仅用于传播资讯之目的. 原文出 ...
- git学习一二三一
svn用的多,但是我是一个geek,git这个美丽的scm,我怎能错过了?于是最近在全方位的窥视它的酮体,把我的一点心得分享给大家把. 先说一说给git的历史, Git是一个开源的分布式版本控制系统, ...
- LAMP架构之PHP-FPM 服务器
PHP简介 安装PHP 解决依赖关系 # 请配置好yum源(系统安装源及epel源)后执行如下命令: yum -y groupinstall "Desktop Platform Develo ...
- 【转】以太网帧、IP报文格式
原文:https://www.cnblogs.com/yongren1zu/p/6274460.html https://blog.csdn.net/gufachongyang02/article/d ...
- 【机器学习】Logistic Regression 的前世今生(理论篇)
Logistic Regression 的前世今生(理论篇) 本博客仅为作者记录笔记之用,不免有非常多细节不正确之处. 还望各位看官能够见谅,欢迎批评指正. 博客虽水,然亦博主之苦劳也. 如需转载,请 ...
- 阿里云构建Kafka单机集群环境
简介 在一台ECS阿里云服务器上构建Kafa单个集群环境需要如下的几个步骤: 服务器环境 JDK的安装 ZooKeeper的安装 Kafka的安装 1. 服务器环境 CPU: 1核 内存: 2048 ...
- mycat系列-Mycat 分片规则
分片规则概述 在数据切分处理中,特别是水平切分中,中间件最终要的两个处理过程就是数据的切分.数据的聚合.选择合适的切分规则,至关重要,因为它决定了后续数据聚合的难易程度,甚至可以避免跨库的数据聚合处理 ...
- iOS 根据圆心的坐标点、半径、当前手势所在的坐标点,计算出圆的运动轨迹坐标
/** * 根据圆心的坐标点.半径.当前手势所在的坐标点,计算出圆的运动轨迹坐标 * @param radius 圆心半径 * @param centerCircle 圆心的坐标点 * @param ...
- ZH奶酪:PHP的cURL库
原文链接:http://coolshell.cn/articles/664.html 参考链接:http://www.runoob.com/php/php-ref-curl.html 使用PHP的cU ...