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的更多相关文章

  1. [Hadoop] - Hadoop Mapreduce Error: GC overhead limit exceeded

    在运行mapreduce的时候,出现Error: GC overhead limit exceeded,查看log日志,发现异常信息为 2015-12-11 11:48:44,716 FATAL [m ...

  2. 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 ...

  3. 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: ...

  4. 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 ...

  5. android studio Error:java.lang.OutOfMemoryError: GC overhead limit exceeded

    android studio Error:java.lang.OutOfMemoryError: GC overhead limit exceeded 在app下的build.gradle中找到and ...

  6. eclipse一直报An internal error occurred during: "Building workspace". GC overhead limit exceeded

    最近导入到eclipse里的工程挺大的,每次eclipse启动之后都回update workspace,然后就一直报: An internal error occurred during: " ...

  7. eclipse:An internal error occurred during: "Build Project". GC overhead limit exceeded

    在使用Eclipse的Build Project功能时,提示以下错误: An internal error occurred during: "Build Project". GC ...

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

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

  9. oozie: GC overhead limit exceeded 解决方法

    1.异常表现形式 1)  提示信息      Error java.lang.OutOfMemoryError: GC overhead limit exceeded 2)提示出错      Erro ...

随机推荐

  1. 用C#进行DirectX开发

    DirectX 9.0 的Manage DirectX部分包括下列九个程序集. Microsoft.DirectX.AudioVideoPlayback.dll Microsoft.DirectX.D ...

  2. CSS命名规范和规则

    一.命名规则 ).尽量不缩写,除非一看就明白的单词 二.class的命名 (1).red { color: red; } .f60 {color: #f60; } .ff8600{ color: #f ...

  3. struts2 18拦截器详解(九)

    ScopedModelDrivenInterceptor 该拦截器处于defaultStack第八的位置,其主要功能是从指定的作用域内检索相应的model设置到Action中,该类中有三个相关的属性: ...

  4. sql 根据另一个表的数据更新当前表

    --update mchk --set shwdjh=dbo.erpzhong.zhongbz--from erpzhong--where mchk.dwmch=erpzhong.matno

  5. Sphinx + Coreseek 实现中文分词搜索

    Sphinx + Coreseek 实现中文分词搜索 Sphinx Coreseek 实现中文分词搜索 全文检索 1 全文检索 vs 数据库 2 中文检索 vs 汉化检索 3 自建全文搜索与使用Goo ...

  6. String escape/unescape into XML

    Is there any C# function which could be used to escape and un-escape a string, which could be used t ...

  7. Android Studio “懒人”必备插件android layout id converter

    在一个布局文件里.假设定义了非常多非常多id,代码中一个个findview是一件非常枯燥而且浪费时间的事情. 所以这里向大家推荐一个必备插件android layout id converter. 配 ...

  8. Windows 环境 cygwin 安装 SSH

    本文内容 安装环境 安装 cygwin 安装 SSH 服务 启动 sshd 服务 SSH 免密码登录 验证 SSH 是否已安装成功 验证 SSH 是否可以免密码登录本机 安装环境 Windows 20 ...

  9. ActiveMQ持久化方式

    ActiveMQ持久化方式 发表于8个月前(2014-09-04 15:55)   阅读(686) | 评论(0) 17人收藏此文章, 我要收藏 赞1 慕课网,程序员升职加薪神器,点击免费学习 摘要  ...

  10. linux下更改主机名方法hostname

    一.永久修改修改/etc/sysconfig/network,在里面指定主机名称HOSTNAME=然后执行命令hostname 主机名这个时候可以注销一下系统,再重登录之后就行了. 或者修改/etc/ ...