OutOfMemoryError - GC overhead limit exceeded

L'eccezione java.lang.OutOfMemoryError: GC overhead limit exceeded è lanciata dal Garbage Collector quando l'applicazione sta spendendo troppo tempo proprio per la "raccolta della spazzatura". In sostanza, l'eccezione ci sta dicendo di aumentare la memoria (heap size) o di riconfigurare i parametri associati al Garbage Collector. Secondo la Sun/Oracle:

The parallel/concurrent 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.

Quindi, le azioni che possono essere prese sono:

  • Aumentare la memoria, ad esempio con -Xmx4096M (o di più se si dispone di una macchina 64bit)
  • Disabilitare il controllo del Garbage Collector con -XX:-UseGCOverheadLimit