Excepción OOM y ajuste de parámetros jvm

1. Existen varias situaciones de OOM.

Además del contador del programa, varias otras áreas de tiempo de ejecución de la memoria de la máquina virtual pueden ser OOM, pero el desbordamiento de la memoria del montón es el más común.

1. Desbordamiento de memoria del montón


Información general de excepción: java.lang.OutOfMemoryError: espacio de almacenamiento dinámico de Java

   El montón de Java se utiliza para almacenar instancias de objetos. Mientras sigamos 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á un desbordamiento de memoria después del número de Los objetos alcanzan el límite máximo de capacidad del montón.

2. Desbordamiento de la pila de máquinas virtuales y de la pila de métodos locales

   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 cuando el tamaño de la pila es mayor, la cantidad de subprocesos que se pueden asignar es menor.

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

Información de excepción: java.lang.OutOfMemoryError: espacio PermGen
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, devuelve el objeto String que representa esta cadena en el grupo; de lo contrario, agrega la cadena contenida en este objeto String al grupo constante y devuelve esta referencia A. a un 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 mediante
-XX:PermSize y -XX:MaxPermSize , limitando así indirectamente la capacidad del grupo constante.

4. Desbordamiento del área del método

Información de excepción: java.lang.OutOfMemoryError: espacio PermGen

   El área de método se utiliza para almacenar información relevante de 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.

   El desbordamiento del área de método también es una excepción común de desbordamiento de memoria. Si el recolector de basura va a reclamar una clase, las condiciones de juicio son muy estrictas. Preste especial atención a este punto en aplicaciones que suelen generar dinámicamente una gran cantidad de Clases.

2. Ideas comunes para la solución de varios problemas

1. Comprobación de desbordamiento de memoria del montón.

(1) Cuando se inicia el programa, podemos configurar los siguientes parámetros para generar un archivo de volcado cuando la memoria se desborda:
   -XX:Xms20m;
    -XX:Xms20m:
    -XX:+HeapDumpOnOutOfMemoryError
    -XX:HeapDumpPath=D:/(nota que no hay número)

El comando anterior está configurado para generar información de desbordamiento cuando se produce un desbordamiento de memoria. En el trabajo real, es imposible esperar a que se procese el desbordamiento real y los datos se monitorearán en tiempo real.

(2). Utilice jmap para ver el estado de la memoria en tiempo real/exportar archivos de volcado.
Generalmente, existen los siguientes pasos:
    (1).jps -l: busque la identificación del proceso actual.
    (2).jmap -heap pid: ver los datos del proceso actual (uso de la generación anterior y la nueva generación)
    (3).jmap -dump:format=b,file=app.hprof pid (exportar el archivo hprof del proceso, el mapeo del situación de memoria)
Nota: el archivo va seguido del archivo. El nombre y la ruta del archivo se generan automáticamente y se muestran en cmd, simplemente vaya a la ruta correspondiente para buscar el archivo.

2. El uso de CPU del proceso Java es demasiado alto.

inserte la descripción de la imagen aquí

3. Pérdida de memoria del proceso Java.

Utilice principalmente el comando jstat para comprobar la situación del GC:
jstat -gc pid [intervalo]

El significado de cada parámetro es el siguiente:
inserte la descripción de la imagen aquí

3. Ajuste de JVM

Portal: Entrevistador: Cómo realizar el ajuste JVM (con casos reales)

   jvm tuning, el ajuste es estable y no le brindará una mejora significativa en el rendimiento. No hace falta decir que la estabilidad del servicio es importante. Para garantizar la estabilidad del servicio, gc siempre será uno de los factores inestables que los programadores de Java deben considerar. Para servicios complejos y de alta concurrencia, es necesario garantizar que no habrá degradación del rendimiento en cada gc y que varios indicadores de rendimiento no fluctuarán. La recuperación de gc es regular y limpia, y se deben encontrar las configuraciones de jvm adecuadas. El gc completo afectará más el rendimiento. Según los problemas del código, evite la frecuencia completa del gc. Puede aumentar adecuadamente la capacidad de la generación joven, de modo que los objetos grandes puedan activar yong gc en la generación joven, ajustar la frecuencia de reciclaje de los objetos grandes en la generación joven y garantizar que los objetos grandes se reciclen en la generación joven tanto como sea posible. Y acortar el tiempo de recuperación de la generación anterior.

1. Varias herramientas comunes.

2. Ejemplo de comando.

3. Ajuste: establece la proporción de memoria de la nueva generación y la antigua generación.

1. Este parámetro tiene un gran impacto en el rendimiento del sistema y el comportamiento del GC.

La nueva generación generalmente establece 1/3-1/4 de todo el espacio del montón:
    -Xmn10m: establece el tamaño inicial de la nueva generación en 10 m.

2. -XX:SurvivorRatio: se utiliza para establecer la proporción del espacio eden y desde/hacia el espacio en la nueva generación,
    es decir, -XX:SurvivorRatio=eden/from=eden/to
    Ejemplo: -Xmn10m -XX:SurvivorRatio=2 Entonces eden5m, from yt son 2,5 m cada uno
3.-XX:NewRatio=Vieja generación/Nueva generación
    Establece la relación entre la generación antigua y la nueva generación.

Estrategia básica:

Reserve objetos en la nueva generación tanto como sea posible para reducir la cantidad de GC en la generación anterior.

Suplemento:
Oracle no forma un documento para todos los parámetros del montón. Si queremos verificar un determinado parámetro, podemos verlo a través del comando
java -XX:+PrintFlagsFinal -version

inserte la descripción de la imagen aquí

Si necesita verificar algún parámetro, puede hacerlo directamente más tarde.

Este artículo es una reproducción de: Análisis y solución Ajuste de parámetros OOM y JVM

Supongo que te gusta

Origin blog.csdn.net/qq_36256590/article/details/132446928
Recomendado
Clasificación