Saltar al contenido

Error java.lang.OutOfMemoryError: se excedió el límite de sobrecarga de GC

Contamos con tu apoyo para compartir nuestros artículos acerca de las ciencias informáticas.

Solución:

Este mensaje significa que, por algún motivo, el recolector de elementos no utilizados está tardando demasiado (de forma predeterminada, el 98 % de todo el tiempo de CPU del proceso) y recupera muy poca memoria en cada ejecución (de forma predeterminada, el 2 % del almacenamiento dinámico).

Esto significa efectivamente que su programa deja de hacer cualquier progreso y está ocupado ejecutando solo la recolección de elementos no utilizados en todo momento.

Para evitar que su aplicación consuma tiempo de CPU sin hacer nada, la JVM lanza este Error para que tenga la oportunidad de diagnosticar el problema.

Los casos raros en los que he visto que esto sucede es donde algún código estaba creando toneladas de objetos temporales y toneladas de objetos con referencias débiles en un entorno que ya tenía mucha memoria limitada.

Consulte la guía de ajuste de Java GC, que está disponible para varias versiones de Java y contiene secciones sobre este problema específico:

  • La guía de ajuste de Java 11 tiene secciones dedicadas al exceso de GC para diferentes recolectores de basura:
    • para el colector paralelo
    • para el recopilador de barrido de marcas concurrente (CMS)
    • no se menciona esta condición de error específica para el recolector Garbage First (G1).
  • Guía de ajuste de Java 8 y su sección High GC
  • Guía de ajuste de Java 6 y su sección de GC excesivo.

Citando del artículo de Oracle Punto de acceso de Java SE 6[tm] Ajuste de la recolección de elementos no utilizados de la máquina virtual”:

Tiempo de GC excesivo y OutOfMemoryError

El recopilador paralelo arrojará un OutOfMemoryError si se dedica demasiado tiempo a la recolección de elementos no utilizados: si se dedica más del 98 % del tiempo total a la recolección de elementos no utilizados y se recupera menos del 2 % del almacenamiento dinámico, se generará un OutOfMemoryError. Esta función está diseñada para evitar que las aplicaciones se ejecuten durante un período de tiempo prolongado mientras avanzan poco o nada debido a que el montón es demasiado pequeño. Si es necesario, esta función se puede desactivar agregando la opción -XX:-UseGCOverheadLimit a la línea de comandos.

EDITAR: parece que alguien puede escribir más rápido que yo 🙂

Si está seguro de que no hay pérdidas de memoria en su programa, intente:

  1. Aumente el tamaño del montón, por ejemplo -Xmx1g.
  2. Habilitar el recopilador de pausa baja concurrente -XX:+UseConcMarkSweepGC.
  3. Reutilice los objetos existentes cuando sea posible para ahorrar algo de memoria.

Si es necesario, la verificación de límite se puede desactivar agregando la opción -XX:-UseGCOverheadLimit a la línea de comandos.

Al final de la página puedes encontrar los comentarios de otros programadores, tú igualmente eres capaz mostrar el tuyo si lo deseas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *