当我执行JUnit测试时,我得到了这个错误消息:

java.lang.OutOfMemoryError: GC overhead limit exceeded

我知道什么是OutOfMemoryError,但是GC开销限制意味着什么?我怎么解决这个问题?


当前回答

Java堆大小描述(xms, xmx, xmn)

-Xms size in bytes

Example : java -Xms32m

设置Java堆的初始大小。 默认大小为2097152 (2MB)。 该值必须是1024字节(1KB)的倍数且大于1024字节。 (-server标志将默认大小增加到32M。)

-Xmn size in bytes

Example : java -Xmx2m

设置Eden生成的初始Java堆大小。 默认值为640K。 (-server标志将默认大小增加到2M。)

-Xmx size in bytes

Example : java -Xmx2048m

设置Java堆可以增长到的最大大小。 默认大小为64M。 (-server标志将默认大小增加到128M。) 最大堆限制大约是2 GB (2048MB)。

Java内存参数(xms, xmx, xmn)格式化

在设置Java堆大小时,应该使用字母“m”或“m”表示MB,或使用字母“g”或“g”表示GB来指定内存参数。如果指定“MB”或“GB”,则该设置将不起作用。有效参数是这样的:

-Xms64m或-Xms64m -Xmx1g或-Xmx1g 还可以用2048MB指定2GB吗 另外,确保在指定参数时使用整数。使用-Xmx512m是一个有效的选项,但是-Xmx0.5g会导致错误。

这种推荐对某些人是有帮助的。

其他回答

这条消息意味着由于某种原因,垃圾收集器花费了过多的时间(默认情况下占进程所有CPU时间的98%),并且在每次运行中回收的内存非常少(默认情况下占堆时间的2%)。

这实际上意味着您的程序停止执行任何进度,并且一直忙于只运行垃圾收集。

为了防止应用程序占用CPU时间而不做任何事情,JVM抛出这个错误,以便您有机会诊断问题。

我很少看到这种情况发生的情况是,一些代码在已经非常受内存限制的环境中创建了大量临时对象和大量弱引用对象。

请查看Java GC调优指南,该指南可用于各种Java版本,其中包含关于此特定问题的部分:

Java 11调优指南中有针对不同垃圾收集器的过量GC的专门章节: 用于并联集热器 用于同步标记扫描(CMS)收集器 对于垃圾优先(G1)收集器,没有提到这种特定的错误条件。 Java 8调优指南及其过量GC部分 Java 6调优指南及其过量GC部分。

引用Oracle的文章“Java SE 6 HotSpot[tm]虚拟机垃圾收集调优”:

Excessive GC Time and OutOfMemoryError The parallel collector will throw an OutOfMemoryError if too much time is being spent in garbage collection: if more than 98% of the total time is spent in garbage collection and less than 2% of the heap is recovered, an OutOfMemoryError will be thrown. This feature is designed to prevent applications from running for an extended period of time while making little or no progress because the heap is too small. If necessary, this feature can be disabled by adding the option -XX:-UseGCOverheadLimit to the command line.

编辑:看起来有人打字比我快:)

您可以尝试通过参考此映像来更改服务器设置,并增加用于处理的内存大小 流程更改以黄色突出显示

你也可以通过打开cmd-> set _java_opts - xmx2g来改变java堆 2g(2gb),这取决于程序的复杂程度

尽量少使用常数变量和临时变量

重启MacBook帮我解决了这个问题。

根据Java[8]平台,标准版故障处理指南,错误原因:(强调和换行符添加)

[…“GC overhead limit exceeded”表示垃圾收集器一直在运行,Java程序进展非常缓慢。 在垃圾收集之后,如果Java进程花费大约98%的时间进行垃圾收集,如果它回收的堆不到2%,并且到目前为止已经连续进行了5次(编译时间常数)垃圾收集,则抛出Java .lang. outofmemoryerror。[…]

Increase the heap size if current heap is not enough. If you still get this error after increasing heap memory, use memory profiling tools like MAT ( Memory analyzer tool), Visual VM etc and fix memory leaks. Upgrade JDK version to latest version ( 1.8.x) or at least 1.7.x and use G1GC algorithm. . The throughput goal for the G1 GC is 90 percent application time and 10 percent garbage collection time Apart from setting heap memory with -Xms1g -Xmx2g , try -XX:+UseG1GC -XX:G1HeapRegionSize=n -XX:MaxGCPauseMillis=m -XX:ParallelGCThreads=n -XX:ConcGCThreads=n

看看更多关于G1GC的相关问题

G1上的Java 7 (JDK 7)垃圾收集和文档 生产环境中的Java G1垃圾收集 Oracle technetwork关于GC优化的文章