Comprensión profunda de jvm y parámetros de ajuste básicos de jvm

Principio de la máquina virtual de Java

Una máquina virtual es una máquina virtual. Es un software que se utiliza para ejecutar una serie de instrucciones de computación virtual. En general, las máquinas virtuales se pueden dividir en: máquinas virtuales de sistema y máquinas virtuales de programa. Las famosas Visual Box y Vmare pertenecen a las máquinas virtuales de sistema. Son completamente para computación física. Emulación, que proporciona una plataforma de software que puede ejecutar un sistema operativo completo.

El código típico de la máquina virtual del programa es la máquina virtual Java, que está especialmente calculada para ejecutar un solo programa informático, y las instrucciones ejecutadas en la máquina virtual Java se convierten en instrucciones de código propias de Java. Ya sea una máquina virtual de sistema o una máquina virtual de programa, el software que se ejecuta en ella está limitado a los recursos proporcionados por la máquina virtual.

Antes de entender jvm, echemos un breve vistazo a la estructura de memoria de java:
inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

Para cada parte diferente, la descripción de su función básica se resume de la siguiente manera,

  1. Subsistema de carga de clases: encargado de cargar información de clases desde el sistema de archivos o red, y la información cargada se almacena en un espacio de memoria llamado área de método;
  2. Área de método: almacena información de clase, información constante, información de grupo constante, incluidos literales de cadena y constantes numéricas.
  3. Montón de Java: el montón de Java se establece cuando se inicia la máquina virtual de Java. Es el área de trabajo de la memoria principal del programa Java. Casi todas las instancias de objetos se almacenan en el montón de Java, y el espacio del montón es compartido por todos los subprocesos.
  4. Memoria directa: la biblioteca JavaNio permite que los programas Java dirijan la memoria, lo que mejora el rendimiento; por lo general, la memoria directa es más rápida que el montón de Java. Puede ser considerado para ocasiones con lectura y escritura frecuentes.
  5. Cada subproceso de máquina virtual tiene una pila privada. La pila de Java de un subproceso se crea cuando se crea el subproceso. La pila de Java guarda variables locales, parámetros de métodos, llamadas a métodos y valores devueltos de colegas en Java.
  6. La pila de métodos nativos, la mayor diferencia es que la pila de métodos nativos se usa para llamadas a métodos nativos. La máquina virtual de Java permite que Java llame directamente a métodos nativos (escritos en C)
  7. El sistema de recolección de basura es el núcleo de Java, y también es indispensable. Java tiene su propio mecanismo de limpieza de basura, y los desarrolladores no necesitan limpiarlo manualmente.
  8. El registro de PC (contador de programas) también es un espacio privado para cada subproceso. La máquina virtual Java crea un registro de PC para cada subproceso. En cualquier momento, un subproceso Java siempre está ejecutando un método. Este método se denomina método actual. Si el método actual no es Para métodos locales, el registro de la PC siempre ejecuta la instrucción que se está ejecutando actualmente. Si es un método local, el registro de la PC está subdefinido y el registro almacena información como el puntero del entorno de ejecución actual, el tecnólogo del programa, la pila de operaciones puntero y puntero variable calculado.
  9. El componente central de la máquina virtual es el motor de ejecución, que es responsable de ejecutar el código de bytes de la máquina virtual. Generalmente, los usuarios primero lo compilan en código de máquina y luego lo ejecutan.

Diferencia de concepto entre montón, pila y área de método

montón de Java

La memoria del montón se usa para almacenar objetos y arreglos creados por new. La memoria asignada en el montón es administrada por el recolector de basura automático de la máquina virtual Java. Después de generar una matriz u objeto en el montón, también se puede definir una variable especial en la pila. El valor de esta variable es igual a la primera dirección de la matriz u objeto en la memoria del montón. Esta variable especial en la pila se convierte en Después de obtener la variable de referencia de la matriz u objeto, la variable de referencia en la memoria de pila se puede usar en el programa para acceder a la matriz u objeto en el montón.La variable de referencia es equivalente a un alias o nombre de código para la matriz o objeto.

Dependiendo del mecanismo de recolección de elementos no utilizados, el almacenamiento dinámico de Java puede tener diferentes estructuras.La más común es dividir todo el almacenamiento dinámico de Java en
la nueva generación y la generación anterior. Entre ellos, las cuerdas vocales nuevas almacenan objetos recién nacidos u objetos de edad joven, y la vejez almacena objetos de edad avanzada.

La nueva generación se divide en área den, área s0 y área s1. s0 y s1 también se denominan áreas desde y hacia. Son dos espacios de igual tamaño y pueden interactuar entre sí.

En la mayoría de los casos, el objeto se ubica primero en el área eden. Después de reclamar la nueva generación, si el objeto aún está vivo, ingresará al área s0 o s1, y luego cada vez que pase

La nueva generación se recicla.Si el objeto sobrevive, su edad se incrementa en 1. Después de que el objeto alcanza cierta edad, ingresa a la generación anterior.

inserte la descripción de la imagen aquí

pila de Java

La pila de Java es un espacio privado de subprocesos, una pila, que generalmente consta de tres partes: tabla de variables locales, pila de datos de operación y área de
datos de marco.
Los resultados intermedios también se utilizan como espacio de almacenamiento temporal para variables en el proceso de cálculo.
Área de datos del marco: además de la tabla de variables locales y la pila de datos de operación, la pila también necesita algunos datos para admitir el análisis del conjunto de constantes. Aquí, el área de datos del marco contiene
el puntero para acceder al conjunto de constantes, lo cual es conveniente para que el programa acceda al conjunto de constantes. Además, cuando la función regresa o cuando ocurre una excepción, la máquina virtual debe tener una tabla de manejo de excepciones, lo cual es conveniente para
encontrar el código anormal al enviar una excepción. Por lo tanto, el manejo de excepciones la tabla también es parte del área de datos del marco.

inserte la descripción de la imagen aquí

Área de métodos Java

El área de métodos de Java es la misma que el montón. El área de métodos es un área de memoria compartida por todos los subprocesos, que guarda la información de clase del sistema.
Tales como campos de clase, métodos, grupos de constantes, etc. El tamaño del área del método determina cuántas clases puede contener el sistema. Si el sistema
define demasiadas clases, el área de métodos se desborda. La máquina virtual también arroja errores de falta de memoria. El área del método puede entenderse
como el área permanente.

Configuración de parámetros de máquina virtual

¿Qué es la configuración de parámetros de la máquina virtual?

Durante la ejecución de la máquina virtual, si se puede rastrear el estado de ejecución del sistema, será útil para la resolución de problemas. Por esta razón, la máquina virtual proporciona algunos parámetros para rastrear el estado del sistema y ejecuta Java usando los parámetros dados. La máquina virtual puede imprimir registros relevantes cuando el sistema está funcionando, lo que puede usarse para analizar problemas reales. Configuramos los parámetros de la máquina virtual, de hecho, alrededor del montón, la pila, el área del método, la configuración, y lo más importante es la configuración de parámetros de la nueva generación y la generación anterior en la memoria del montón,

Configuración de parámetros del montón

-XX:+PrintGC Imprimir registros relacionados cada vez que se activa GC
-XX:+UseSerialGC Reciclaje en serie
-XX:+PrintGCDetails Registros de GC más detallados- Valor
inicial del montón
Xms -Valor máximo disponible del montón Xmx- Xmn Máximo disponible
del montón de nueva generación El valor
- XX: SurvivorRatio se usa para establecer la relación entre el espacio
eden y desde/hasta el espacio en la nueva generación.
al tamaño máximo de almacenamiento dinámico,
el beneficio de esto es que puede reducir el número de recolecciones de basura cuando el programa se está ejecutando, mejorando así la eficiencia.
-XX:SurvivorRatio se usa para establecer la proporción de eden space y from/to space en la nueva generación.

establecer la memoria de montón máxima

Tipo: -Xms5m -Xmx20m -XX:+ImprimirDetallesGC -XX:+UsarSerialGC -XX:+ImprimirBanderas de Línea de Comandos

Establezca los parámetros de optimización de nueva generación y generación anterior

-Xmn El tamaño de la nueva generación, generalmente establecido en alrededor de 1/3 a 1/4 de todo el montón
-XX: SurvivorRatio Establece la proporción entre el área de eden y el espacio desde/hasta en la nueva generación n/1

Establecer el parámetro de escala de nueva generación

Tipo: -Xms20m -Xmx20m -Xmn1m -XX:SupervivienteRatio=2 -XX:+ImprimirDetallesGC -XX:+UsarSerialGC

Establecer parámetros de nueva y vieja generación

-Xms20m -Xmx20m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC
-Xms20m -Xmx20m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC
-XX:NewRatio= 2Resumen
:diferente El montón distribución tendrá un cierto impacto en la ejecución del sistema.En el trabajo real, se debe hacer una configuración razonable de acuerdo con las características del sistema.La estrategia básica es reservar objetos en la nueva generación tanto como sea posible y reducir el número de GC. en la vieja generación. Además de configurar el tamaño absoluto de la nueva generación (-Xmn), puede usar (-XX:NewRatio) para configurar la relación entre la nueva generación y la generación anterior: -XX:NewRatio=generación anterior/nueva generación

solución de desbordamiento de memoria

Establecer el tamaño de la memoria del montón

Motivo del error: java.lang.OutOfMemoryError: espacio de almacenamiento dinámico de Java

Solución: establezca el tamaño de la memoria del montón -Xms1m -Xmx70m -XX:+HeapDumpOnOutOfMemoryError

Establecer el tamaño de la memoria de pila

Razón del error: java.lang.StackOverflowError

El desbordamiento de pila se produce a partir de llamadas recursivas y el recorrido de bucle no es posible, pero las llamadas recursivas se producen en métodos de bucle y también se producen desbordamientos de pila.
Solución: establezca la profundidad máxima de llamada del hilo
: Xss5m establece la profundidad máxima de llamada

El desbordamiento de memoria de Tomcat modifica el tamaño de la memoria del montón de JVM en catalina.sh

JAVA_OPTS=“-servidor -Xms800m -Xmx800m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxNewSize=512m”

Resumen de ajuste de parámetros de JVM

En los parámetros de inicio de JVM, puede configurar algunos parámetros relacionados con la memoria y la recolección de basura. De forma predeterminada, la JVM funcionará bien sin ninguna configuración, pero algunos servidores bien configurados y aplicaciones específicas deben ajustarse cuidadosamente para obtener el mejor rendimiento. Mediante el establecimiento de algunos objetivos que esperamos lograr:

  1. El tiempo de GC es lo suficientemente pequeño
  2. El número de GC es lo suficientemente bajo
  3. El ciclo de GC completo es lo suficientemente largo

Los dos primeros son actualmente contradictorios.Si el tiempo de GC es pequeño, se debe obtener un montón más pequeño.Para garantizar que el número de GC sea lo suficientemente pequeño, se debe garantizar un montón más grande.Solo podemos tomar un equilibrio.

  1. Para la configuración del montón de JVM, los valores mínimo y máximo generalmente pueden estar limitados por -Xms -Xmx Para evitar que el recolector de basura reduzca el montón entre los valores mínimo y máximo, generalmente establecemos el máximo y el mínimo valores al mismo valor.
  2. La generación joven y la generación anterior asignarán memoria de almacenamiento dinámico de acuerdo con la proporción predeterminada (1: 2). Puede ajustar el tamaño entre los dos ajustando la proporción NewRadio entre los dos, o para la generación de colección, como la generación joven , hasta -XX:newSize -XX:MaxNewSize para establecer su tamaño absoluto. Además, para evitar la reducción del almacenamiento dinámico de la generación joven, generalmente establecemos -XX: newSize -XX: MaxNewSize en el mismo tamaño
  3. ¿Qué tan grande es la generación joven y la vieja generación para ser considerada razonable? No hay duda de que esta pregunta mía no tiene respuesta, de lo contrario no habría afinación. Veamos el impacto del cambio en el tamaño de los dos
  • La generación joven más grande conducirá inevitablemente a una generación antigua más pequeña, la generación joven grande prolongará el ciclo normal de GC, pero aumentará el tiempo de cada GC; la generación antigua pequeña conducirá a un GC completo más frecuente
  • La generación joven más pequeña conducirá inevitablemente a una generación anterior más grande, la generación joven pequeña conducirá a un GC normal frecuente, pero cada tiempo de GC será más corto; la generación anterior grande reducirá la frecuencia del GC completo
  • La forma de elegir debe depender de la distribución del ciclo de vida del objeto de la aplicación: si la aplicación tiene una gran cantidad de objetos temporales, se debe seleccionar una generación joven más grande; si hay relativamente muchos objetos persistentes, la generación anterior se debe aumentar adecuadamente.

Sin embargo, muchas aplicaciones no tienen características tan obvias. Se deben considerar los siguientes dos puntos al tomar una decisión: (A) Basado en el principio de la menor cantidad posible de GC completos, deje que la generación anterior almacene en caché tantos objetos comunes como sea posible. La proporción predeterminada de JVM es 1: 2. (B) Al observar la aplicación durante un período de tiempo para ver cuánta memoria ocupará la generación anterior en el pico, aumente la generación joven de acuerdo con la situación real sin afectar el GC completo Por ejemplo, la relación se puede controlar en 1:1. Pero al menos 1/3 del espacio de crecimiento debe reservarse para la generación anterior

Supongo que te gusta

Origin blog.csdn.net/shuux666/article/details/124122392
Recomendado
Clasificación