Cómo comprobar y resolver el problema del desbordamiento de memoria de la máquina virtual Java
1. Área de memoria JVM
1. Contador de programa
Un pequeño espacio de memoria, utilizado como el número de línea del código de bytes ejecutado por el indicador del hilo actual.
2. Pila de Java
Al igual que el contador del programa, la pila de Java (pila de máquina virtual) también es privada para el subproceso y su ciclo de vida es el mismo que el del subproceso. Por lo general, almacena tipos de datos básicos, referencias de objetos (un puntero de referencia que apunta a la dirección inicial del objeto o un identificador que representa el objeto), tipo de dirección de retorno (que apunta a la dirección de una instrucción de código de bytes)
Hay dos tipos de áreas de pila Tipo de excepción: 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 se puede expandir dinámicamente (la mayoría de las máquinas virtuales se pueden expandir dinámicamente); ), no se puede solicitar suficiente memoria al expandirse. Se generará una excepción OutOfMemoryError.
3. La pila de métodos locales
es muy 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 el método local. La máquina virtual utiliza la pila para el servicio del método nativo. Al igual que la pila de máquinas virtuales, se pueden generar excepciones StackOverflowError y OutOfMemoryError.
4. Montón de Java
Java
El montón es el área más grande en la memoria 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, que se puede subdividir en la nueva generación y la antigua generación. Si no hay memoria en el montón para completar la asignación de instancia y no se puede expandir, se generará una excepción OutOfMemoryError
.
5. Área de método
Al igual que javaHeap, es un área de memoria compartida por cada hilo. Se utiliza para almacenar información de clases, constantes, variables estáticas y variables en tiempo real. han sido cargados por la máquina virtual. El código y otros datos compilados por el compilador. Cuando el área del método no puede cumplir con los requisitos de asignación de memoria, se generará una excepción OutOfMemoryError. El método también contiene el grupo constante de tiempo de ejecución que se escucha con frecuencia, que se utiliza para almacenar varios literales y referencias de símbolos generados durante la 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 un área de memoria definida en la especificación de la máquina virtual Java. fuera de la JVM. Esta área también puede causar excepciones OutOfMemoryError.
En segundo lugar, parámetros de jvm
-Xss (StackSpace) espacio de pila
-Xms, -Xmx (memoria de montón
espacio) montón Espacio: Heap es el área más familiar para todos. Es el área utilizada por jvm para almacenar instancias de objetos. El tamaño máximo de Heap es 2G en sistemas de 32 bits. Su tamaño está controlado por -Xms y
El valor predeterminado es 1 de la memoria física /4, 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 por -. Xmx. Esta proporción se puede especificar mediante
-XX:MinHeapFreeRatio Cuando la memoria del montón libre está libre Cuando la memoria del montón es superior al 70%, la JVM ajustará el tamaño del montón al tamaño especificado por - Xms. Puede especificar esta relación a través de
-XX:MaxHeapFreeRatio, pero generalmente para evitar ajustes frecuentes en el tamaño de HeapSize, los valores de -Xms y -Xmx se establecen en el mismo valor.
-XX:PermSize -XX:MaxPermSize: Tamaño de generación persistente del área del método: el área del método también se comparte globalmente. Bajo ciertas condiciones, también será GC Cuando el área del método necesite usar memoria. Si se excede el tamaño permitido, se generará un mensaje de error OutOfMemory.
3. Soluciones a errores comunes de desbordamiento de memoria
1. Excepción OutOfMemoryError
Además del contador del programa, existen otras áreas de tiempo de ejecución de la memoria de la máquina virtual. Existe la posibilidad de que se produzca una excepción OutOfMemoryError (OOM).
Desbordamiento del montón de Java
Información general sobre la excepción: java.lang.OutOfMemoryError:espacios del montón de Java
montón de Java. uso Para almacenar instancias de objetos, siempre que continuemos creando objetos y asegurándonos de que haya una ruta accesible entre GC Roots y los objetos para evitar que el mecanismo de recolección de basura borre estos objetos, se producirá una excepción de desbordamiento de memoria después de que la cantidad de objetos alcance el límite máximo de capacidad de almacenamiento dinámico.
Cuando ocurre este tipo de excepción, el método general es analizar primero la instantánea del volcado del montón volcado a través de una herramienta de análisis de imágenes de memoria (como Eclipse Memory
Analyzer), centrándose en confirmar Si el objeto es necesario, primero distinga si se debe a una pérdida de memoria (Memory
Leak) o a un desbordamiento de memoria (Memory Overflow).
Si se trata de una pérdida de memoria, puede utilizar herramientas adicionales para ver la cadena de referencia desde el objeto filtrado hasta GC Roots. Por lo tanto, podemos descubrir la ruta a través de la cual el objeto filtrado está asociado con GC Roots y evita que el recolector de basura lo recicle 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 aquí que cuanto mayor sea el tamaño de la pila, mayor el número de hilos que se pueden asignar son pocos.
3. Desbordamiento del grupo constante de tiempo de ejecución
Información de excepción: java.lang.OutOfMemoryError:PermGen space
Si desea agregar contenido al grupo constante de tiempo de ejecución, La forma más sencilla es utilizar el método nativo String.intern(). La función de este método es: si el grupo ya contiene una cadena igual a esta Cadena, devolver el objeto String que representa la cadena en el grupo; de lo contrario, agregar la cadena contenida en este objeto Cadena al; grupo constante y devuelve una referencia a este objeto String
. Dado que el grupo constante se asigna en el área del método, podemos limitar el tamaño del área del método a través de -XX:PermSize y -XX:MaxPermSize, limitando así indirectamente la capacidad del grupo constante.
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.OutOfMemoryError:PermGen space
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, el juicio. La condición es muy dura. En aplicaciones que suelen generar dinámicamente una gran cantidad de Clases, se debe prestar especial atención a este punto.