Red de conocimientos sobre prescripción popular - Conocimiento dental - Cómo verificar y resolver el problema de desbordamiento de memoria de la máquina virtual Java

Cómo verificar y resolver el problema de desbordamiento de memoria de la máquina virtual Java

Primero, área de memoria jvm

1, contador de programa

Un pequeño espacio de memoria que sirve como indicador de número de línea para el código de bytes ejecutado por el hilo actual.

2. Pila de Java

Al igual que el contador del programa, la pila de Java (pila de máquina virtual) es privada para el hilo y su ciclo de vida es el mismo que el del hilo. Normalmente, se almacenan tipos de datos básicos, referencias de objetos (punteros de referencia que apuntan a la dirección inicial de un objeto o identificadores que representan objetos) y tipos de direcciones de retorno (direcciones que apuntan a instrucciones de código de bytes).

Hay dos tipos de excepciones en el área de la pila: si la profundidad de la pila solicitada por el subproceso es mayor que la profundidad permitida por la máquina virtual, se generará una excepción StrackOverflowError si la pila de la máquina virtual puede; expandirse dinámicamente (la mayoría de las máquinas virtuales pueden expandirse dinámicamente), cuando no se puede aplicar memoria insuficiente durante la expansión, se generará una excepción OutOfMemoryError.

3. Pila de métodos locales

Similar a la pila de máquinas virtuales, la diferencia es que la pila de máquinas virtuales sirve a la máquina virtual para ejecutar métodos java, mientras que la pila de métodos locales es la Método nativo utilizado por la máquina virtual. Al igual que con las pilas de máquinas virtuales, se pueden generar excepciones StackOverflowError y OutOfMemoryError.

4. Montón de Java

Lenguaje Java (un lenguaje informático, especialmente utilizado para crear sitios web)

El montón es el área de memoria más grande administrada por jvm. JavaHeap es un área de memoria compartida por todos los subprocesos y se crea cuando se inicia la máquina virtual. Almacena principalmente instancias de objetos. JavaHeap

Es el área principal administrada por el recolector de basura y se puede subdividir en nueva generación y antigua generación. Si no hay memoria en el montón para completar la asignación de instancia y ya no se puede expandir, se generará un OutOfMemoryError.

No es normal.

5. Área de método

Igual que javaHeap, es un área de memoria compartida por cada hilo y se utiliza para almacenar información de clase, constantes, variables estáticas y código compilado por el compilador. tiempo, y Otros datos que la máquina virtual ha cargado. Cuando el área del método no puede cumplir con los requisitos

Al guardar los requisitos asignados, se generará una excepción OutOfMemoryError. Este método también contiene un grupo constante de tiempo de ejecución común para almacenar varias referencias literales y simbólicas generadas en tiempo de compilación.

6. Memoria directa

La memoria directa no es parte del área de datos de tiempo de ejecución de la máquina virtual, ni es el área de memoria definida en la especificación de la máquina virtual Java, sino un área de memoria externa. la JVM, lo que también puede causar una excepción OutOfMemoryError.

En segundo lugar, parámetros de jvm

-Xss (espacio de pila) espacio de pila

-Xms, -Xmx (memoria de montón

Espacio) Espacio de montón: el montón es el área más familiar, utilizada por la JVM para almacenar instancias de objetos. En sistemas de 32 bits, la capacidad máxima de almacenamiento dinámico es 2G y su tamaño está determinado por -Xms y.

-Xmx se usa para controlarlo. -Xms es la memoria de almacenamiento dinámico mínima que se aplica cuando se inicia jvm. El valor predeterminado es 1/64 de la memoria física, pero menos de 1G es el máximo. memoria de montón que la jvm puede solicitar.

El valor predeterminado es 1/4 de la memoria física, generalmente menos de 1G. De forma predeterminada, cuando la memoria del montón libre es inferior al 40%, la jvm maximizará el tamaño del montón al tamaño especificado -Xmx, que se puede especificar mediante

-XX:minheafpreeratio. Cuando la memoria del montón libre excede el 70%, la JVM ajustará el tamaño del montón al tamaño especificado por -Xms. Esta proporción se puede especificar mediante -xx: maxheapratio, pero para evitar ajustes frecuentes. el tamaño de HeapSize. Por lo general, los valores de -Xms y -Xmx se establecen en el mismo valor.

-XX:PermSize -XX:MaxPermSize: el tamaño de generación persistente del área del método: el área del método también es el mundo * * *, y también será GCed bajo ciertas condiciones. Cuando la memoria requerida por un área de método excede su tamaño permitido, se genera el mensaje de error OutOfMemory.

3. Soluciones a errores comunes de desbordamiento de memoria

1. Excepción de error OutOfMemoryError

Además del contador del programa, varios otros errores de tiempo de ejecución en la memoria de la máquina virtual. Las regiones también pueden experimentar excepciones de falta de memoria (OOM).

Desbordamiento del montón de Java

Información general de excepción: java.lang Error de falta de memoria: espacio del montón de Java.

El montón de Java se utiliza para almacenar instancias de objetos. Siempre que sigamos creando objetos y nos aseguremos de que haya una ruta accesible entre la raíz del GC y los objetos para evitar que el mecanismo de recolección de basura borre estos objetos, cuando la cantidad de objetos alcance el límite máximo de capacidad del montón, se producirá una excepción de desbordamiento de memoria. ocurrirá.

Este tipo de excepción generalmente ocurre a través de herramientas de análisis de imágenes de memoria (como Eclipse Memory)

Analyzer) para realizar un análisis de instantáneas en el montón de volcado. La clave es confirmar si el objeto. en la memoria primero es necesario distinguir si se debe a una pérdida de memoria (pérdida de memoria) o a un desbordamiento de memoria.

Si se trata de una pérdida de memoria, puede utilizar herramientas para ver más a fondo la cadena de referencia desde el objeto filtrado hasta la raíz del GC. Entonces podemos descubrir cómo el objeto filtrado está asociado con la raíz del GC y el recolector de basura no puede recuperarlo automáticamente.

Si no hay ninguna fuga, debes comprobar si los parámetros de la máquina virtual (-Xmx y -Xms) están configurados correctamente.

2. Desbordamiento de la pila de la máquina virtual y del método local

Si la profundidad de la pila solicitada por el subproceso es mayor que la profundidad máxima permitida por la máquina virtual, se generará una excepción StackOverflowError. .

Si la máquina virtual no puede solicitar suficiente espacio de memoria al expandir la pila, se generará una excepción OutOfMemoryError.

Cabe señalar que cuanto mayor sea la pila, menos subprocesos se podrán asignar.

3. Desbordamiento constante del grupo de tiempo de ejecución

Información de excepción: java.lang. Error de falta de memoria: perm genspace

Si desea agregar contenido al tiempo de ejecución. grupo constante, la forma más sencilla es utilizar el método nativo String.intern(). Lo que hace este método es: Si el grupo ya contiene un igual.

La cadena de esta cadena devuelve un objeto String que representa esta cadena en el grupo; de lo contrario, la cadena contenida en este objeto String se agrega al grupo constante y se devuelve la cadena.

Una referencia al objeto. Debido a que el grupo de constantes se asigna en el área del método, podemos usar -XX:PermSize y -XX:MaxPermSize para limitar el tamaño del área del método, limitando así indirectamente las constantes en ella.

La capacidad de la piscina.

4. Desbordamiento del área de método

El área de método se utiliza para almacenar información relacionada con la clase, como el nombre de la clase, el modificador de acceso, el grupo constante, la descripción del campo, la descripción del método, etc.

Información de excepción: java.lang. Error de falta de memoria: perm genspace

El desbordamiento del área del método también es una excepción de desbordamiento de memoria común. Si el recolector de basura va a reciclar una clase, las condiciones de juicio son muy duras. Preste especial atención a esto en aplicaciones donde a menudo se generan dinámicamente grandes cantidades de clases.