Recibo este mensaje de error cuando ejecuto mis pruebas JUnit:
java.lang.OutOfMemoryError: GC overhead limit exceeded
Sé lo que OutOfMemoryError
es, pero ¿qué significa el límite superior de GC? ¿Como puedo resolver esto?
java
garbage-collection
out-of-memory
heap-memory
Mnementh
fuente
fuente
OutOfMemoryError
escenarios para los cuales aumentar el montón no es una solución válida: quedarse sin subprocesos nativos y quedarse sin perm gen (que es independiente del montón) son dos ejemplos. Tenga cuidado al hacer declaraciones demasiado amplias sobreOutOfMemoryErrors
; Hay un conjunto inesperadamente diverso de cosas que pueden causarlos.Respuestas:
Este mensaje significa que, por alguna razón, el recolector de basura está tomando una cantidad de tiempo excesiva (por defecto, el 98% de todo el tiempo de CPU del proceso) y recupera muy poca memoria en cada ejecución (por defecto, el 2% del montón).
Esto significa que su programa deja de progresar y está ocupado ejecutando solo la recolección de basura en todo momento.
Para evitar que su aplicación absorba el tiempo de CPU sin hacer nada, la JVM lanza esto
Error
para que tenga la oportunidad de diagnosticar el problema.Los casos raros en los que he visto que esto sucede es cuando algún código creaba toneladas de objetos temporales y toneladas de objetos con referencias débiles en un entorno que ya tiene mucha memoria.
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:
fuente
Citando el artículo de Oracle "Java SE 6 HotSpot [tm] Virtual Machine Garbage Collection Tuning" :
EDITAR: parece que alguien puede escribir más rápido que yo :)
fuente
-XX:
comienzo de varias opciones de línea de comando hay una especie de indicador que indica que esta opción es altamente específica de VM e inestable (sujeta a cambios sin previo aviso en futuras versiones). En cualquier caso, el-XX:-UseGCOverheadLimit
indicador le dice a la VM que deshabilite la comprobación del límite de sobrecarga del GC (en realidad "lo apaga"), mientras que su-Xmx
comando simplemente aumentó el montón. En el último caso, la comprobación general de GC todavía se estaba ejecutando , solo parece que un montón más grande resolvió los problemas de agitación de GC en su caso (esto no siempre ayudará).Si está seguro de que no hay pérdidas de memoria en su programa, intente:
-Xmx1g
.-XX:+UseConcMarkSweepGC
.Si es necesario, la verificación del límite se puede deshabilitar agregando la opción
-XX:-UseGCOverheadLimit
a la línea de comando.fuente
List
objeto dentro del bucle provocó que GC se llamara 39 veces en lugar de 22 veces.Suele ser el código. Aquí hay un ejemplo simple:
Usando Java 1.6.0_24-b07 en un Windows 7 de 32 bits.
Entonces mira
gc.log
Ahora concedido, esta no es la mejor prueba o el mejor diseño, pero cuando se enfrenta a una situación en la que no tiene más remedio que implementar dicho ciclo o cuando se trata de código existente que se comporta mal, elegir reducir los objetos en lugar de crear nuevos puede reducir la cantidad de veces que el recolector de basura se interpone en el camino ...
fuente
gc.log
archivo. Mis pruebas muestran muchas menos veces en general, pero pocos tiempos de "Disparadores" para MEJOR, y ahora, MALO es "más malo" que lo PEOR ahora. Mis cuentas: MALO: 26, PEOR: 22, MEJOR 21.List<Double> list
en el bucle externo en lugar de antes del bucle externo, y activé 39 recolecciones de basura.Causa del error de acuerdo con la plataforma Java [8], Guía de solución de problemas de la edición estándar : (énfasis y saltos de línea agregados)
Además de configurar la memoria de almacenamiento dinámico con -
Xms1g -Xmx2g
, intenteEche un vistazo a algunas preguntas más relacionadas con G1GC
Recolección de basura y documentación de Java 7 (JDK 7) en G1
Recolección de basura Java G1 en producción
Artículo de Oracle technetwork para el ajuste fino de GC
fuente
Simplemente aumente un poco el tamaño del montón configurando esta opción en
Ejecutar → Ejecutar configuraciones → Argumentos → Argumentos de VM
Xms - para límite mínimo
Xmx - para límite máximo
fuente
arguments
pestaña ... ¿qué debemos hacer para lograr esto?Para mí, los siguientes pasos funcionaron:
eclipse.ini
archivoCambio
a
Reiniciar Eclipse
Mira aquí
fuente
prueba esto
abre el
build.gradle
archivofuente
Lo siguiente funcionó para mí. Simplemente agregue el siguiente fragmento:
fuente
aumente javaMaxHeapsize en su archivo build.gradle (Módulo: aplicación)
a (Agregar esta línea en gradle)
fuente
Descripciones de tamaño de almacenamiento dinámico de Java (xms, xmx, xmn)
Establece el tamaño inicial del montón de Java. El tamaño predeterminado es 2097152 (2 MB). Los valores deben ser múltiplos de, y mayores que, 1024 bytes (1 KB). (El indicador -server aumenta el tamaño predeterminado a 32M).
Establece el tamaño de almacenamiento dinámico Java inicial para la generación Eden. El valor predeterminado es 640K. (El indicador de servidor aumenta el tamaño predeterminado a 2M).
Establece el tamaño máximo al que puede crecer el montón de Java. El tamaño predeterminado es 64M. (El indicador -server aumenta el tamaño predeterminado a 128M.) El límite máximo de almacenamiento dinámico es de aproximadamente 2 GB (2048MB).
Formato de argumentos de memoria Java (xms, xmx, xmn)
Al configurar el tamaño de almacenamiento dinámico de Java, debe especificar su argumento de memoria utilizando una de las letras "m" o "M" para MB, o "g" o "G" para GB. Su configuración no funcionará si especifica "MB" o "GB". Los argumentos válidos se ven así:
-Xms64m o -Xms64M -Xmx1g o -Xmx1G También puede usar 2048MB para especificar 2GB Además, asegúrese de usar números enteros al especificar sus argumentos. Usar -Xmx512m es una opción válida, pero -Xmx0.5g causará un error.
Esta referencia puede ser útil para alguien.
fuente
También puede aumentar la asignación de memoria y el tamaño del montón agregando esto a su
gradle.properties
archivo:org.gradle.jvmargs=-Xmx2048M -XX\:MaxHeapSize\=32g
No tiene que ser 2048M y 32g, hazlo tan grande como quieras.
fuente
Resuelto:
Sólo tiene que añadir
org.gradle.jvmargs=-Xmx1024m
en
gradle.properties
y si no existe, crear.
fuente
Estoy trabajando en Android Studio y encontré este error al intentar generar un APK firmado para su lanzamiento. Pude compilar y probar un APK de depuración sin problemas, pero tan pronto como quise compilar un APK de lanzamiento, el proceso de compilación se ejecutaría durante minutos y finalmente terminaría con el "Error java.lang.OutOfMemoryError: GC límite superior excedido ". Aumenté los tamaños de almacenamiento dinámico tanto para la VM como para el compilador DEX de Android, pero el problema persistió. Finalmente, después de muchas horas y tazas de café, resultó que el problema estaba en mi archivo 'build.gradle' de nivel de aplicación: tenía el parámetro 'minifyEnabled' para el tipo de compilación de lanzamiento establecido en 'falso', por lo tanto, ejecuté cosas de Proguard en código que no ha pasado por el proceso de reducción de código '(consulte https://developer.android.) Cambié el parámetro 'minifyEnabled' a 'verdadero' y la compilación de lanzamiento se ejecutó como un sueño :)
En resumen, tuve que cambiar mi archivo 'build.gradle' de nivel de aplicación de: // ...
a
fuente
Para aumentar el tamaño de almacenamiento dinámico en IntelliJ IDEA, siga las siguientes instrucciones. Funcionó para mi.
Para usuarios de Windows,
Vaya a la ubicación donde está instalado IDE y busque lo siguiente.
Edite el archivo y agregue lo siguiente.
Eso es !!
fuente
puede intentar realizar cambios en la configuración del servidor haciendo referencia a esta imagen y aumentar el tamaño de la memoria para procesar los cambios del proceso resaltados en amarillo
También puede hacer cambios en Java Heap abriendo cmd->
set _java_opts -Xmx2g
2g (2gigabytes) dependiendo de la complejidad de su programa
intenta usar variables menos constantes y variables temporales
fuente
Debe aumentar el tamaño de la memoria en Jdeveloper, vaya a setDomainEnv.cmd .
y
fuente
En Netbeans, puede ser útil diseñar un tamaño de almacenamiento dinámico máximo. Vaya a Ejecutar => Establecer configuración del proyecto => Personalizar . En el Ejecutar de su ventana emergente, vaya a la Opción VM , complete
-Xms2048m -Xmx2048m
. Podría resolver el problema del tamaño del montón.fuente
Reiniciar mi MacBook solucionó este problema por mí.
fuente
No sé si esto sigue siendo relevante o no, pero solo quiero compartir lo que funcionó para mí.
Actualice la versión de kotlin a la última disponible. https://blog.jetbrains.com/kotlin/category/releases/
Y ya está hecho.
fuente