I get this error message as I execute my JUnit tests:
java.lang.OutOfMemoryError: GC overhead limit exceeded
I know what an OutOfMemo
Quoting from Oracle's article "Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning":
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.
EDIT: looks like someone can type faster than me :)
Cause for the error according to the Java [8] Platform, Standard Edition Troubleshooting Guide: (emphasis and line breaks added)
[...] "GC overhead limit exceeded" indicates that the garbage collector is running all the time and Java program is making very slow progress.
After a garbage collection, if the Java process is spending more than approximately 98% of its time doing garbage collection and if it is recovering less than 2% of the heap and has been doing so far the last 5 (compile time constant) consecutive garbage collections, then a
java.lang.OutOfMemoryError
is thrown. [...]
Apart from setting heap memory with -Xms1g -Xmx2g
, try
-XX:+UseG1GC -XX:G1HeapRegionSize=n -XX:MaxGCPauseMillis=m
-XX:ParallelGCThreads=n -XX:ConcGCThreads=n
Have a look at some more related questions regarding G1GC
Java 7 (JDK 7) garbage collection and documentation on G1
Java G1 garbage collection in production
Oracle technetwork article for GC finetuning