Interpretación de parámetros y memoria JVM

Visión general:
 
        Cuando se inicia la máquina virtual Java, se crean áreas de método y memoria dinámica
       El área de método almacena principalmente información compartida, como información de clase, constantes y variables estáticas cargadas por la máquina virtual.
       Cuando se genera un subproceso, la máquina virtual crea una pila de máquina virtual, una pila de método local, un contador y lo asigna al subproceso. Cuando el subproceso ejecuta un método, se genera un marco de pila. Las variables y parámetros locales en el método (datos básicos) Tipo y tipo de referencia) se almacenarán en el marco de la pila, la instancia del objeto y la información de la instancia de matriz en este método se almacenarán en la memoria del montón
       Al ingresar un método, el marco de la pila anterior se insertará en la pila y el nuevo método se colocará en la parte superior de la pila. Después de ejecutar el nuevo método, el segmento de código de ejecución del método anterior se encontrará de acuerdo con la dirección de retorno en el marco de la pila y la pila se abrirá.
       Cuando se complete la ejecución de este hilo, la pila se destruirá en consecuencia
 
 
El área de memoria JVM se divide en cinco partes, a saber, montón, área de método, pila de máquina virtual, pila de método local y contador de programa.

 

Contador de programa (registro de PC): hilo privado

El contador de programa es un indicador de número de línea que registra el código de bytes ejecutado por el hilo actual
 
De modo que cuando el procesamiento simultáneo de múltiples subprocesos, la CPU informa a la CPU del registro completo después del cambio de contexto, evitando operaciones repetidas
 

Máquina virtual stack-thread privado

La pila de la máquina virtual es un área de memoria en la memoria de la máquina virtual, que es privada para el hilo.
 
Se utiliza para almacenar marcos de pila, un marco de pila corresponde a un método
 
El pop y el push del marco de pila corresponden al final del método y al comienzo de la llamada
 
-Xss se refiere a la configuración del tamaño de pila de cada subproceso. Antes de JDK1.5, el tamaño de pila predeterminado era 256K, y el tamaño predeterminado después de eso era 1M
  • Marco de pila un marco de pila completo contiene la siguiente información:
    • Tabla de variables locales
    • Pila de operandos
    • Información del marco de pila
  • Tabla de variables locales ---- Pila
     La tabla de variables locales almacena los parámetros del método y las variables locales.
 
     Estas entradas pueden ser datos de tipo básico y tipo de datos de referencia
 
  • Pila de operandos
     La pila de operandos puede entenderse como un área de almacenamiento temporal de datos que se utiliza para el cálculo en la pila de la máquina virtual Java. El resultado se enviará a la pila y luego aparecerá en la tabla de variables locales.
 
  • Información del marco de pila
     La información del marco de pila incluye: la dirección de entrada del método en sí, la dirección de retorno del método, información de depuración u otra información adicional
Hay una excepción :
  • StackOverflowError :
  • JVM asignará un cierto tamaño de memoria para la pila de la máquina virtual de cada subproceso ------>      parámetro -Xss
     
    Por lo tanto, la cantidad de marcos de pila que puede contener la pila de la máquina virtual es limitada. Si los marcos de la pila continúan insertándose en la pila pero no fuera de la pila, el espacio de memoria de la pila de la máquina virtual del subproceso actual eventualmente se agotará y se lanzará una excepción.


     
  • OutOfMemoryError (OOM) :
  • Si la máquina virtual no puede solicitar suficiente memoria al expandir la pila, lanzará una excepción OutOfMemmoryError

     

Native Stack-thread privado

 
Al igual que la pila de máquinas virtuales, tiene las características de aislamiento de subprocesos y puede generar excepciones StackOverflowError y OutOfMemoryError
 
El objeto servido por la pila de métodos local es el método nativo ejecutado por la JVM, mientras que la pila de la máquina virtual sirve el método java ejecutado por la JVM

 

Java heap (Head) - intercambio de subprocesos

 

El montón de Java es un área de memoria compartida por todos los subprocesos, creada cuando se inicia la máquina virtual
 
El único propósito de esta área de memoria es almacenar instancias de objetos. Casi todas las instancias de objetos asignan memoria aquí

 

La memoria de JVM se divide en memoria de pila y memoria que no es de pila
 
Memoria de montón:
        (1/3) Generación joven:
                       |                     
                       | === (8/10) Edén
                       |
                       | === (2/10) Área de supervivientes
                                                |
                                                | === (1/10) FromSpace
                                                |
                                                | === (1/10) ToSpace
                
        (2/3) Vieja generación
 
Memoria sin montón:
       Generación permanente (Generación permanente)
Memoria de montón:
Los objetos se almacenan y el recolector de basura recolecta estos objetos y luego los recicla de acuerdo con el algoritmo de GC.
Memoria sin montón:
La generación permanente, también llamada área de método, almacena objetos de larga duración como metadatos de clase, métodos, constantes, atributos, etc.
Generación joven (nueva) :
La generación joven se utiliza para almacenar los objetos Java que acaba de asignar la JVM.
Titular (Titular):
Los objetos que no se recolectan mediante recolección de basura en la generación joven se copiarán a la generación anterior
Generación permanente (permanente):
Almacena de forma permanente metainformación de clases y métodos, cuyo tamaño está relacionado con la escala del proyecto, la cantidad de clases y métodos. Generalmente, 128M es suficiente. El principio de configuración es reservar el 30% del espacio
 
 
Observaciones:
 
La versión JDK1.8 obsoleta la generación permanente, en lugar de MetaSpace (MetaSpace)
 
El metaespacio es similar a la generación permanente, y ambos son la realización del área de método
 
La mayor diferencia entre ellos es: el metaespacio no está en la JVM, pero usa memoria local
 
Hay dos parámetros en el metaespacio:
 
MetaspaceSize: inicializa el tamaño del metaespacio y controla el umbral de GC
MaxMetaspaceSize: Limite el límite superior del tamaño del metaespacio para evitar ocupar de forma anormal demasiada memoria física

Área de método

El área de método también se denomina "generación permanente"
 
Se utiliza para almacenar información de clase, constantes y variables estáticas cargadas por la máquina virtual, y es un área de memoria compartida por cada hilo.
 
En HotSpot JVM antes de JDK8, estas áreas "permanentes" se denominan "generación permanente"
 
La generación permanente es un espacio de almacenamiento dinámico contiguo antes del inicio de la JVM estableciendo parámetros en la línea de comando -XX: MaxPermSize para establecer la generación permanente de
 
El espacio de memoria máximo asignable, el tamaño predeterminado es 64 M (el valor predeterminado de JVM de 64 bits es 85 M)
 
Después de JDK8, JVM ya no tiene una generación permanente (PermGen)
 
Pero la información de metadatos de la clase (metadatos) todavía está allí, pero ya no se almacena en un espacio dinámico continuo, sino que se mueve a una memoria local llamada "Metaspace" (memoria nativa)

 

Configuración relacionada con el área de método o la generación inmortal
 
-XX: PermSize = 64 MB de tamaño mínimo, asignación inicial
-XX: MaxPermSize = 256 MB Tamaño de asignación máximo permitido, asignado a pedido
Establecer basura no reciclar
-XX: + CMSClassUnloadingEnabled
-XX: + CMSPermGenSweepingEnabled
Tamaño predeterminado
El MaxPermSize predeterminado en la opción -server es 64m
El MaxPermSize predeterminado en la opción -client es 32m

Configuración de parámetros de memoria JVM

-Xms —————————— Establece el tamaño de espacio mínimo del montón
 
-Xmx —————————— Establece el tamaño de espacio máximo del montón
 
-Xmn —————————— Establecer el tamaño de la generación joven
 
-XX: NewSize —————————— Establezca el tamaño de espacio mínimo de la nueva generación
 
-XX: MaxNewSize —————————— Establecer el tamaño de espacio máximo de la nueva generación
 
-XX: PermSize —————————— Establezca el tamaño de espacio mínimo de la generación permanente
 
-XX: MaxPermSize —————————— Establecer el tamaño de espacio máximo de la generación permanente
 
-Xss —————————— Establecer el tamaño de la pila de cada hilo
 
-XX: + UseParallelGC ———————— Seleccione el recolector de basura como recolector paralelo
                                                    Esta configuración solo es válida para la generación joven, es decir, bajo la configuración anterior, la generación joven usa la recolección concurrente, mientras que la generación anterior todavía usa la recolección en serie.
 
-XX: ParallelGCThreads = 20 —————————— Configure el número de subprocesos del recolector paralelo, es decir: cuántos subprocesos son basura recolectada al mismo tiempo
Referencia típica de configuración de parámetros de JVM:
 
 
java-Xmx3550m-Xms3550m-Xmn2g-Xss128k
-XX: ParallelGCThreads = 20
-XX: + UseConcMarkSweepGC
-XX: + UseParNewGC

 

Análisis:

-Xmx3550m:
Establezca la memoria máxima disponible de JVM en 3550M
 
-Xms3550m:
Establecer la memoria inicial de JVM en 3550 m
Este valor se puede establecer igual que -Xmx para evitar que la JVM reasigne memoria después de que se complete cada recolección de basura
 
-Xmn2g:
Establezca el tamaño de la generación joven en 2G.
El tamaño completo del montón = tamaño de generación joven + tamaño de generación anterior + tamaño de generación persistente
La generación permanente generalmente tiene un tamaño fijo de 64 m, por lo que después de aumentar la generación joven, el tamaño de la generación anterior se reducirá.
 
-Xss128k:
Establezca el tamaño de la pila de cada hilo.
Después de JDK5.0, el tamaño de pila de cada subproceso es 1M, y el tamaño de pila de cada subproceso es 256K antes.
Se puede ajustar de acuerdo al tamaño de memoria requerido por los subprocesos de la aplicación. Bajo la misma memoria física, reducir este valor puede generar más subprocesos
Sin embargo, el sistema operativo todavía tiene un límite en la cantidad de subprocesos en un proceso y no se puede generar de forma indefinida. El valor de experiencia es 3000 ~ 5000 

Supongo que te gusta

Origin blog.csdn.net/weixin_43562937/article/details/106537146
Recomendado
Clasificación