Ocasionalmente, en algún lugar entre una vez cada 2 días a una vez cada 2 semanas, mi aplicación se bloquea en un lugar aparentemente aleatorio en el código con: java.lang.OutOfMemoryError: GC overhead limit exceeded
. Si I Google este error llego a this SO question y que me llevan a this piece of sun documentation cuales expains:Duración del tiempo GC excesivo en "java.lang.OutOfMemoryError: el límite superior del GC excedió"
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.
Lo que me que mi solicitud está aparentemente gastando el 98% del tiempo total en la recolección de basura dice para recuperar sólo el 2% de la montón.
¿Pero 98% de qué tiempo? ¿El 98% de las dos semanas completas que la aplicación ha estado funcionando? 98% del último milisegundo?
Estoy tratando de determinar el mejor enfoque para resolver realmente este problema en lugar de solo usar -XX:-UseGCOverheadLimit
, pero siento la necesidad de comprender mejor el problema que estoy resolviendo.
De los documentos, parece ser el 98% de las 2 semanas completas. Ha habilitado los registros de GC con estos indicadores -verbose: gc -XX: + PrintGCDetails XX: + PrintGCTimeStamps -Xloggc: PATH_FROM_ROOT/gclog.log. Sería bueno ver el tiempo de ejecución de la aplicación y el tiempo de parada debido a GC. – JoseK
El registro de GC es una buena sugerencia. Lo intentaré. El 98% de las 2 semanas parece improbable pero tiene razón, eso es lo que implican los documentos. Espero que sea solo una escritura imprecisa –
¿Has descubierto el significado del 98% del tiempo? Mi opinión es que GC debe estar ocupado ocupando el 98% de la utilización de la aplicación en el mismo momento en que ocurre la excepción y no durante las 2 semanas. –