Red de conocimiento informático - Material del sitio web - ¿Cómo ver la configuración de GC y jvm?

¿Cómo ver la configuración de GC y jvm?

Aunque Java recupera memoria automáticamente, es mejor que las aplicaciones (especialmente los programas de servidor) especifiquen límites de asignación de memoria según las condiciones comerciales. De lo contrario, la aplicación podría fallar.

Un ejemplo de lo que esto significa:

-Xms128m

Indica que el tamaño mínimo del montón de JVM es 128 MB, que se asigna inicialmente.

-Xmx512m

Indica que el tamaño máximo permitido del montón de JVM es 256 MB, que se asigna bajo demanda.

Nota: Si no se especifica -Xmx o es demasiado pequeño, la aplicación puede encontrar un error java.lang.OutOfMemory porque la JVM no se puede lanzar y, por lo tanto, no puede usar try.... .catch para capturar él.

PermSize y MaxPermSize representan el límite de asignación de memoria por parte de la máquina virtual para objetos Java generados permanentemente, como objetos de clase, objetos de método y objetos de reflexión. Estos objetos no están incluidos en el área del montón.

-XX:PermSize=64 MB de tamaño mínimo, asignación inicial

-XX:MaxPermSize=256 MB de tamaño máximo de asignación permitido, asignación bajo demanda

Demasiado pequeño causará :java.lang.OutOfMemoryError: espacio PermGen

MaxPermSize=256 MB.

El valor predeterminado de MaxPermSize está relacionado con la opción -server -client.

El valor predeterminado de MaxPermSize en las opciones del servidor es 64m

El valor predeterminado de MaxPermSize en las opciones del cliente es 32m

Experiencia:

1. Tenga en cuenta que al utilizar la opción de restricción mínima Xms, PermSize ya puede ahorrar recursos del sistema.

============================================ === ==============

He estado estudiando el monitoreo del uso de la memoria jvm recientemente, así que he recopilado algunos métodos para observar el uso de la memoria de las máquinas virtuales. Y establezco los parámetros de jvm. También tengo algunos conocimientos:

Varios conceptos básicos:

Espacio PermGen: el nombre completo es Espacio de generación permanente, es decir, espacio de generación permanente. En otras palabras, es un área guardada permanentemente que se utiliza para almacenar información de clase y meta. La clase se coloca en esta área cuando la carga GC (recolección de basura) no debe limpiar el espacio de PermGen, por lo que si su APLICACIÓN CARGARÁ una gran cantidad. CLASS, entonces es probable que tenga un error de espacio PermGen.

Espacio de montón: instancia de almacenamiento. El montón de Java se divide en tres áreas: montón de generación joven (Young), montón de generación anterior (Old) y montón permanente (Permanente). Young almacena el objeto recién creado. Cuando esta área está llena, el GC mueve los objetos al área Antigua, mientras que el área Permanente es responsable de almacenar los objetos reflejados.

El significado de varias configuraciones de parámetros:

xms/xmx: define el tamaño total del segmento Joven+VIEJO. ms es el tamaño de la memoria Young+OLD cuando se inicia la JVM; mx es el tamaño máximo de la memoria Young+OLD que se puede ocupar. En un entorno de producción, estos dos valores generalmente se establecen en el mismo valor para minimizar la sobrecarga de las solicitudes de memoria en tiempo de ejecución.

NewSize/MaxNewSize: Define el tamaño del segmento JOVEN. NewSize es el tamaño de la memoria JOVEN cuando se inicia la JVM; MaxNewSize es el tamaño máximo de la memoria JOVEN. En entornos de producción de usuarios, estos dos valores generalmente se establecen en el mismo valor para minimizar la sobrecarga de las solicitudes de memoria durante el tiempo de ejecución.

PermSize/MaxPermSize: Define el tamaño del segmento Perm. PermSize es el tamaño de memoria de Perm cuando se inicia JVM; MaxPermSize es el tamaño de memoria máximo de Perm. En un entorno de producción, estos dos valores generalmente se establecen en el mismo valor para minimizar la sobrecarga de las solicitudes de memoria en tiempo de ejecución.

SurvivorRatio: establece la proporción entre el espacio Survivor y el espacio Eden en la generación JOVEN

El proceso de solicitud de bloques de memoria:

A.JVM intenta proporcionar Java relacionado en Eden El objeto inicializa un bloque de memoria

B. Si hay suficiente espacio en Eden, la solicitud de memoria finalizará. De lo contrario, pasará al siguiente paso

C.JVM intentará liberar todos los objetos inactivos en Eden (esto es recolección de basura 1 o superior si todavía no hay suficiente espacio en Eden para colocar nuevos); objetos después del lanzamiento, objeto, intentará colocar algunos objetos activos en Eden en el área Survivor/OLD

D El área Survivor se utiliza como un intercambio intermedio entre Eden y las áreas OLD. El área de Survivor se utiliza como área de intercambio intermedia entre Eden y OLD. Cuando el área OLD tiene suficiente espacio, los objetos en el área de Survivor se moverán al área Old; de lo contrario, permanecerán en el área de Survivor.

E. Cuando no hay suficiente espacio en el área ANTIGUA, la JVM realizará una recolección de basura completa (nivel 0) en el área ANTIGUA

F. no hay suficiente espacio en Survivor y OLD para almacenar los datos de Eden. Algunos objetos copiados en Eden hacen que la JVM no pueda crear un área de memoria para nuevos objetos en Eden y se producirá un "error de falta de memoria".

La configuración de parámetros jvm de nuestro servidor de resina:

"-Xmx2000M-Xms2000M-Xmn500M-XX:PermSize=250M-XX:MaxPermSize=250M-Xss256K-XX:+DisableExplicitGC- XX:SurvivorRatio= 1 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX :+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX.CMSFullGCsBeforeCompaction=0 -XX:+CMSClassUnloadingEnabled -XX:LargePageSizeInBytes=128M -XX:+UseFastAccessorMethods -XX: + UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=60 -XX: SoftRefLRUPolicyMSPerMB=0 -XX: +PrintClassHistogram -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Xloggc:log/gc.log"

Esta es una configuración típica de prioridad de tiempo de respuesta.

Hay cuatro algoritmos de reciclaje diferentes en Java, y los parámetros de inicio correspondientes son

-XX:+UseSerialGC

-XX:+UseParallelGC

-XX:+ UseParallelOldGC

-XX:+UseConcMarkSweepGC

1. Recopilador en serie

La mayoría de las plataformas o fuerza el valor predeterminado del cliente java Utilice esta función.

Algoritmo de generación joven = serial

Algoritmo de generación anterior = serial (mark-sweep-compact)

La desventaja de este método es obvia, es decir, detener el mundo, velocidad lenta. No recomendado para aplicaciones de servidor.

2. Colector paralelo

Esta es la configuración predeterminada en Linux x64, en otras plataformas debe agregar el parámetro java -server.

joven = paralelo, varios subprocesos copian al mismo tiempo

viejo = mark-sweep-compact = 1

Ventajas: el reciclaje de nueva generación es más rápido. Debido a que la mayor parte del tiempo que el sistema realiza gc es en la nueva generación, esto mejorará el rendimiento (la CPU se usa para el tiempo que no es gc)

Desventajas: cuando se ejecutan demasiados objetos en tiempo real de generación anterior en un Servidor 8G/16G, tiempo de pausa demasiado largo

3. Colector compacto paralelo (ParallelOld)

Joven = paralelo = 2

antiguo = paralelo, dividido en múltiples unidades independientes. Si hay menos objetos vivos en la unidad, recíclelos; si hay más, omítalos

Ventajas: el rendimiento de la generación anterior mejora en comparación con el paralelo

Desventajas: El El uso de memoria de la generación anterior de la mayoría de los sistemas de servidores alcanzará el 60% -80%. No hay tantos objetos vivos unitarios ideales que rara vez sean convenientes para un reciclaje rápido. Al mismo tiempo, la sobrecarga de compacidad no se reduce significativamente en comparación con. paralelismo.

4. Recolector de barrido de marcas concurrente (CMS)

generación joven = recolector paralelo = 2

viejo = cms

En el Al mismo tiempo, no realiza operaciones compactas.

Ventajas: El tiempo de pausa se acortará y se recomienda la estrategia 4 para escenarios que son sensibles a las pausas pero que no ocupan la CPU.

Desventajas: el uso de CPU es demasiado alto, no apto para servidores con uso intensivo de CPU. Además, hay demasiados fragmentos. El almacenamiento de cada objeto debe saltar continuamente a N lugares a través de la lista vinculada, y el problema del desperdicio de espacio también aumentará.

Métodos de monitoreo de memoria:

1. jmap -heap pid

Verifique el uso del montón de Java

Utilice la asignación de objetos locales de subprocesos.

Utilice GC(s) paralelos de 4 subprocesos // método GC

Configuración del montón: MinHeapFreeRatio se utiliza para establecer la proporción libre del montón de JVM en un mínimo de 40

MaxHeapFreeRatio =70 // Corresponde al parámetro de inicio de jvm -XX:MaxHeapFreeRatio, que establece la relación máxima libre de montón de JVM (el valor predeterminado es 70)

MaxHeapSize=512.0MB // Corresponde al parámetro de inicio de jvm - XX:MaxHeapSize =set MaxHeapSize=512.0MB // Corresponde al parámetro de inicio de jvm -XX:NewSize=Establece el tamaño predeterminado del montón de JVM de "nueva generación"

MaxNewSize =4095MB // Corresponde a jvm parámetro de inicio -XX:MaxNewSize = 4095MB // Corresponde al parámetro de inicio de jvm -XX:MaxNewSize=Establece el tamaño máximo del montón de JVM de "nueva generación"

OldSize = 4.0MB // Corresponde a jvm parámetro de inicio -XX:OldSize=:Establece el tamaño de la 'generación antigua' del montón de JVM

NewRatio = 8 // Corresponde al parámetro de inicio de jvm -XX:NewRatio=: la relación del tamaño de de la "nueva generación" a la "vieja generación"

SurvivorRatio = 8 // Corresponde a los parámetros de inicio de jvm -XX:SurvivorRatio=Establece la relación de tamaño del área de Eden y el área de Survivor en la generación joven

PermSize= 16.0MB // Corresponde a los parámetros de inicio de jvm -XX:PermSize=: Establece JVM MaxPermSize=64.0MB del montón // Corresponde al parámetro de inicio de jvm -XX: MaxPermSize=: Establece el tamaño máximo de el montón de JVM "generación para siempre"

MaxPermSize=64.0MB // Corresponde al parámetro de inicio de jvm -XX: MaxPermSize=: establece el tamaño máximo del montón de JVM "generación permanente"

Uso del montón: // Almacenamiento provisional de la memoria del montón

PS Young Generation

Eden Space: // Distribución de la memoria del área de Eden

capacidad = 20381696 (19,4375 MB) / /Capacidad total del área de Eden

usada = 20370032 (19.426376342773438MB) //Eden usada

gratis = 11664 (0.0111236572265625MB) //Capacidad restante de Eden

99.94277218147106% usado

Eden usado Ratio

Desde el espacio:

Capacidad = 8519680 (8.125MB)

Usado = 32768 (0.03125 MB)

Disponible = 8486912 (8.09375MB) <

0.38461538461538464% Usado

p>

Espacio de retorno:

Capacidad = 9306112 ( 8.875MB)

Usado = 0 (0.0MB)

Disponible = 9306112 (8.875M

B)

0,0% usado

PS de generación anterior // Distribución de memoria de área antigua actual

Capacidad = 366280704 (349,3125 MB)

Usado = 322179848 (307.25464630126953MB)

Disponible = 44100856 (42.05785369873047MB)

87.95982001825573% Usado

Generación permanente de PS // Memoria de generación "perpetua" actual distribución

Capacidad = 32243712 (30, 75MB)

0,0% utilizado. 75MB)

Usado= 28918584 (27.57891082763672MB)

Disponible= 3325128 (3.1710891723632812MB)

89.68751488662348% Usado

= == ================================================= == ================

jps

-q Solo genera el ID del proceso, no la abreviatura de la clase

-m se utiliza para generar los parámetros pasados ​​al proceso Java (función principal)

-l muestra la ruta completa

-v muestra los parámetros pasados ​​al jvm

jps

-q solo genera el ID del proceso, no la abreviatura de la clase

-m se usa para generar los parámetros pasados ​​al proceso Java (función principal )

-l muestra la ruta completa

-v muestra los parámetros pasados ​​al jvm