El límite de gastos generales de Gc excedió qué hacer. ¿Qué tipos de OutOfMemoryError existen o de qué partes consta la memoria de un proceso java?

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 no puede dejar espacio disponible para acomodar un nuevo objeto y el montón no se puede expandir más. Además, este error puede aparecer cuando no hay suficiente memoria nativa para soportar la carga de un clase java. 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.

14 de abril de 2011 a las 09:02

¿Qué tipos de OutOfMemoryError existen o de qué partes consta la memoria? proceso java

  • 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 punto es que la memoria de un 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 una cierta cantidad 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




Arriba