El límite de gastos generales de Gc excedió qué hacer.

Hogar

14 de abril de 2011 a las 09:02 ¿Qué tipos de OutOfMemoryError existen o de qué partes se compone? memoria java

  • proceso

Java Si detecta un OutOfMemoryError, esto no significa que su aplicación cree muchos objetos que el recolector de basura no pueda limpiar y llene toda la memoria que asignó usando el parámetro -Xmx. Se me ocurren al menos otros dos casos en los que podrías ver este error. El caso es que la memoria proceso java

no se limita al área -Xmx, donde su aplicación crea objetos mediante programación.

El área de memoria ocupada por un proceso java consta de varias partes. El tipo de OutOfMemoryError depende de cuál se quedó sin espacio.

1. java.lang.OutOfMemoryError: espacio del montón de Java

No hay suficiente espacio en el montón, es decir, el área de memoria en la que se colocan los objetos creados mediante programación en su aplicación. El tamaño lo especifican los parámetros -Xms y -Xmx. Si intenta crear un objeto y no queda espacio en el montón, obtendrá este error. Por lo general, el problema radica en una pérdida de memoria, de las cuales hay muchísimas, e Internet simplemente está repleto de artículos sobre este tema.

2. java.lang.OutOfMemoryError: espacio PermGen Este error ocurre cuando no hay suficiente espacio en el área Permanente, cuyo tamaño se especifica mediante los parámetros -XX:PermSize y -XX:MaxPermSize. Lo que hay allí y cómo lidiar con el OutOfMemoryError que surge allí, ya lo he descrito.

con más detalle

3. java.lang.OutOfMemoryError: se excedió el límite de sobrecarga de GC Este error puede ocurrir tanto cuando la primera como la segunda área están desbordadas. Esto se debe a que queda poca memoria y el GC está trabajando constantemente, intentando liberar algo de espacio. este error

se puede deshabilitar usando el parámetro -XX: -UseGCOverheadLimit, pero, por supuesto, no debe deshabilitarse, sino resolver el problema de pérdida de memoria, asignar más espacio o cambiar la configuración del GC.

4. java.lang.OutOfMemoryError: no se puede crear un nuevo hilo nativo Encontré este error por primera vez hace varios años cuando estaba trabajando en prueba de carga y traté de descubrir cantidad máxima usuarios que pueden trabajar con nuestra aplicación web. Utilicé una herramienta especial que me permitió iniciar sesión en usuarios y emularlos. acciones estándar . En clientes, comencé a recibir OutOfMemoryError. Sin leer realmente el texto del mensaje y pensando que no tenía suficiente memoria para crear la sesión de usuario y otros objetos necesarios, aumenté el tamaño del montón de la aplicación (-Xmx). Imagínense mi sorpresa cuando después de esto el número de usuarios que trabajan simultáneamente con el sistema solo disminuyó. Echemos un vistazo más de cerca a cómo sucedió esto.

De hecho, esto es muy fácil de reproducir en Windows en una máquina de 32 bits, ya que no se asignan más de 2 GB al proceso.

Supongamos que tiene una aplicación con una gran cantidad de usuarios simultáneos, que se inicia con los parámetros -Xmx1024M -XX:MaxPermSize=256M -Xss512K. Si hay un total de 2G disponibles para el proceso, quedan libres alrededor de 768M. Es en este resto de memoria donde se crean las pilas de subprocesos. Por lo tanto, aproximadamente no puede crear más de 768*(1024/512)=1536 (pude crear 1316 con estos parámetros) hilos (vea la imagen al principio del artículo), después de lo cual recibirá un OutOfMemoryError. Si aumenta -Xmx, la cantidad de subprocesos que puede crear disminuye en consecuencia. Opción con reducción -Xss, para poder crear más threads no siempre es la respuesta, ya que es posible que tenga threads en su sistema que requieran pilas bastante grandes. Por ejemplo, el hilo de inicialización o algunos tareas en segundo plano. Pero todavía hay una salida. resulta cuando creación de software hilo, puede especificar el tamaño de la pila: Agregar etiquetas

En pocas palabras, la JVM se encarga de liberar memoria cuando los objetos ya no se utilizan; este proceso se llama recolección de basura().

El Límite de gastos generales del GC excedido El error es uno de la familia de java.lang.OutOfMemoryError y es una indicación de agotamiento de recursos (memoria).

En este breve artículo, veremos las causas de la error y como se puede solucionar.

2. Error de límite superior del GC excedido

Error de memoria insuficiente es una subclase de java.lang.VirtualMachineError; La JVM lo lanza cuando encuentra un problema relacionado con la utilización de recursos. Más específicamente, el error ocurre cuando la JVM pasó demasiado tiempo realizando la recolección de basura y solo pude recuperar muy poco espacio del montón.

Según los documentos de Java, de forma predeterminada, la JVM está configurada para generar este error si el proceso Java dedica más del 98% de su tiempo a GC y cuando solo se recupera menos del 2% del montón en cada ejecución. En otras palabras, esto significa que nuestra aplicación ha agotado casi toda la memoria disponible y el recolector de basura ha pasado demasiado tiempo intentando limpiarla y ha fallado repetidamente.

En esta situación, los usuarios experimentan una lentitud extrema de la aplicación. Ciertas operaciones, que normalmente se completan en milisegundos, tardan más en completarse. Esto se debe a que la CPU está utilizando toda su capacidad para la recolección de basura y, por lo tanto, no puede realizar ninguna otra tarea.

3. Error en acción

Veamos un fragmento de código que arroja java.lang.OutOfMemoryError: Límite de sobrecarga de GC excedido.

Podemos lograrlo, por ejemplo, agregando pares clave-valor en un bucle sin terminar:

Clase pública OutOfMemoryGCLimitExceed (public static void addRandomDataToMap() (Mapa mapa de datos = nuevo HashMap<>();

Aleatorio r = nuevo Aleatorio(); mientras (verdadero) ( ​​dataMap.put(r.nextInt(), String.valueOf(r.nextInt())); ) ) ) Cuando se invoca este método, con los argumentos de JVM como -Xmx100m -XX:+UsarParallelGC ( El tamaño del montón de Java se establece en 100 MB y el algoritmo GC es ParallelGC), obtenemos un

java.lang.OutOfMemoryError: Límite de sobrecarga de GC excedido -Xmx100m -XX:+UsarParallelGC ( error. Para comprender mejor los diferentes algoritmos de recolección de basura, podemos consultar el tutorial Conceptos básicos de recolección de basura de Java de Oracle.

conseguiremos un

error muy rápidamente ejecutando el siguiente comando desde la raíz del proyecto: Límite de gastos generales del GC excedido Mvn ejecutivo: ejecutivo

También se debe tener en cuenta que en algunas situaciones podemos encontrar un error de espacio en el montón antes de encontrar el

error. 4. Solución del error de límite superior del GC excedido La solución ideal es encontrar el problema subyacente de la aplicación examinando el

código para

¿Objetos en la aplicación que ocupan grandes porciones del montón? ¿En qué partes del código fuente se asignan estos objetos? Una indicación común de una pérdida de memoria es la excepción java.lang.OutOfMemoryError. Normalmente, este error se produce cuando no hay espacio suficiente para asignar un objeto en el montón de Java. En este caso, El recolector de basura. En raras ocasiones, se puede generar un java.lang.OutOfMemoryError cuando se dedica una cantidad excesiva de tiempo a la recolección de basura y se libera poca memoria.

Cuando se produce una excepción java.lang.OutOfMemoryError, también se imprime un seguimiento de la pila.

La excepción java.lang.OutOfMemoryError también puede ser lanzada por el código de la biblioteca nativa cuando no se puede satisfacer una asignación nativa (por ejemplo, si el espacio de intercambio es bajo).

Un primer paso para diagnosticar una excepción OutOfMemoryError es determinar la causa de la excepción. ¿Se produjo porque el montón de Java está lleno o porque el montón nativo está lleno? Para ayudarle a encontrar la causa, el texto de la excepción incluye un mensaje detallado en el fin como se muestra en la siguiente excepciones.




Arriba