Exception in thread "main" java.lang.OutOfMemoryError:GC overhead limit exceeded

      大家解决这个问题前提是对jvm有一定的了解和认识。面临的问题:Exception in thread "main" java.lang.OutOfMemoryError:GC overhead limit exceeded;也就是超出了GC开销上限。错误提示信息如下图:

Exception in thread

Exception in thread

        如何输出jvm的内存使用状况,添加参数-XX:+PrintGC     -XX:+PrintGCDetails进行设置,就会把一些内存使用状况输出,具体参数的设置可以阅读下面的链接(vm参数设置不懂的可以好好看看):https://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html 。本文重点是解决内存溢出问题,接着下面继续看。


        通过观察输出信息,可以看到eden和object区占用比较大的比例,接近100%,主要是通过调节这两个区的内存大小解决问题。

解决方法:

1、首先设置eclipse的堆内存大小,能够使object对象加载进去,从原来的1G增加到4G,增加这么大的目的是:同时增加young代的空间大小!(获取可以设置到2G、3G在这里没有具体的实验)

2、配置参数主要有(这个可以参看上面链接地址讲解):

-XX:NewSize=2048:young区大小
-XX:MaxNewSize=2048:young区最大大小
-XX:MaxPermSize=1024:永久区大小
-XX:SurvivorRatio=3:eden和from之间的比例,通过这个参数增加eden区的大小
-XX:MaxTenuringThreshold=10:GC回收的次数阈值(垃圾回收年龄)
-XX:ParallelGCThreads=4:xianchengshu
-XX:CMSFullGCsBeforeCompaction=10:多少次后进行内存压缩
-XX:+PrintGC:打印
-XX:+PrintGCDetails:打印

Exception in thread

3、将相关参数进行设置好后,run

4、通过上面的参数调整,得到如下图的运行结果:可以看到eden的百分比降到29%,from区的利用率达到38%,object利用率降低到97%

Exception in thread

    关于内存溢出的情况各种各样,一般都是通过控制台打印内存使用情况,进行针对性的调整!

    这是本人在学习中遇到的问题,大家共同学习参考,如有错误请指正,谢谢!


你可能感兴趣的:(java)