JVM montón de memoria (montón) Comentarios

Montón de Java desempeño de la gestión de memoria es uno de los factores principales.
desbordamiento de pila es un proyecto muy común JAVA falla, antes de resolver este problema, primero hay que entender la memoria montón de Java es cómo funciona.

Vistazo a la forma de memoria montón de Java se divide, como se muestra:

memoria de almacenamiento dinámico de Java y el desbordamiento!  enseñarle un truco nirvana

  1. Memoria de almacenamiento dinámico de JVM se divide en la memoria y no la memoria de pila, la pila de memoria se divide en la generación joven (Young Generation), años (vieja generación), una memoria no permanente montón en una generación (Generación Permanente).
  2. La generación joven está dividida en áreas Eden y superviviente. áreas sobreviviente de composición fromspace y tospace. Eden District, lo que representa una gran capacidad, superviviente de la región representaron dos pequeña capacidad, el ratio de morosidad es de 8: 1: 1.
  3. Uso de la memoria Heap: se almacena en el objeto, el recolector de basura es recoger estos objetos, a continuación, se recuperó de acuerdo con el algoritmo GC.
  4. uso de la memoria no montón: Generación de llamada también zona permanente, el método, la supervivencia de los objetos en tiempo de ejecución de programa almacenados, tales como clases de metadatos, métodos, constantes y otras propiedades a largo plazo.

. En la versión JDK1.8 generaciones abandonado permanentemente En lugar de que el espacio elemento (metaespacio), Yuan espacio permanente en nombre de métodos similares para alcanzar todas las áreas, la mayor diferencia es: Yuan no es el espacio en la JVM, pero el uso de locales la memoria.
Yuan espacio en cuenta que hay dos parámetros:

  • MetaspaceSize: Inicialización espacio miembros, la ocurrencia de GC valor umbral de control
  • MaxMetaspaceSize: restricciones de espacio elemento limitar el tamaño de la memoria física para prevenir la absorción anormal demasiado

¿Por qué eliminar generaciones permanentes?

En nombre de la eliminación permanente de razones: como una fusión HotSpot JVM y JRockit máquina virtual (JVM nueva tecnología) para hacer el cambio, porque no hay generaciones JRockit permanentes.
Con el dólar ya no será un espacio permanente en nombre del problema OOM!

concepto generacional

La nueva generación de la generación joven en la primera área objetivo Edén, Edén, cuando el espacio está lleno, lo que provocó Menor GC, superviviente se mueve el objeto a la zona Survivor0, zona de Survivor0 gatillo completa la ejecución de Menor GC, área Survivor0 objetos vivos se mueven al área de Suvivor1, por lo asegura que haya siempre una zona sobreviviente está vacía desde hace algún tiempo. Después de que el objeto en varias ocasiones Menor GC aún con vida se trasladó a la vieja era.
la supervivencia de los viejos a largo plazo de los objetos almacenados, disparadores Mayor CG = GC completa, GC se detendrá durante todas las discusiones esperar a que el GC cuando se llena, por lo que la respuesta a aplicaciones de alta solicitud para minimizar la ocurrencia Mayor CG, tiempo de espera de respuesta de evitar.
Menor GC: limpiar la generación joven 
Mayor CG: limpieza de edad
GC completo: limpieza de todo el espacio de almacenamiento dinámico, incluyendo la generación joven y la generación permanente de
todos los GC se detendrá todas las hebras de la aplicación.

¿Por generacional?

Los objetos se clasifican en función de la probabilidad de supervivencia, para la supervivencia de objeto desde hace mucho tiempo en un área fija, reduciendo así la pérdida de tiempo y frecuencia GC exploración. Diferentes algoritmos de recolección de basura para la clasificación, el algoritmo debilidades.

¿Por qué espacio sobreviviente sobreviviente se divide en dos partes de igual tamaño?

Principalmente para resolver la fragmentación. Si es grave fragmentación de memoria, es decir, los dos objetos ocupan memoria discreta, no hay suficiente memoria contigua para almacenar un nuevo objeto, se disparará GC.

memoria de pila de JVM utiliza comúnmente parámetros

parámetros descripción
-Xms El tamaño de la pila inicial, la unidad de m, g
-Xmx (MaxHeapSize) El tamaño máximo permitido de la memoria de pila, la memoria física es generalmente no más de 80%
-XX: PermSize La memoria no montón tamaño inicial, los parámetros de la aplicación general de la inicialización 200m, 1024m máxima es suficiente
-XX: MaxPermSize No montón de memoria máximo tamaño admisible
-XX: newSize (-Xns) El tamaño inicial de la generación joven de la memoria
-XX: MaxNewSize (-Xmn) El tamaño máximo permitido de la joven generación de la memoria, también puede abreviada
-XX: SurvivorRatio = 8 Y la relación entre el valor de la capacidad de la región de Edén región generación joven sobreviviente, el valor predeterminado es 8, es decir, 8: 1
-Xss tamaño de la memoria de pila

algoritmo de recolección de basura (GC, recolección de basura)

Roja está marcada objetos inactivos, el verde es el objeto activo.

  • Marcos - Clear (marca y barrido)
    del GC se divide en dos etapas, la marca y barrido. En primer lugar de todos los objetos etiquetados reciclables, todos los objetos están marcados unificaron recuperaron después de la finalización de la bandera. Y producirá la fragmentación de memoria discreta. Cuando la necesidad de asignar objetos de gran tamaño puede causar un exceso de restos después de que el programa se está ejecutando, no se puede encontrar suficiente memoria contigua, y obligado a gatillo GC nuevo.

memoria de almacenamiento dinámico de Java y el desbordamiento!  enseñarle un truco nirvana

  • Copia (Copy)
    capacidad de la memoria se divide en dos por un uso del tiempo único. Cuando éste se queda sin memoria, copiará los objetos que sobreviven a otro trozo de espacio de memoria se ha utilizado una vez y luego salga limpio. De manera que cada vez que el área de memoria para un medio de recuperación, que no consideran el problema de la fragmentación de la memoria, sencilla y eficaz. El inconveniente de requerir el doble de espacio de memoria.

memoria de almacenamiento dinámico de Java y el desbordamiento!  enseñarle un truco nirvana

  • Marcos - acabado (Mark-compacto)
    también se divide en dos etapas, primero de todos los objetos que marcan reciclables, entonces los objetos que sobreviven se mueven hasta el final, a continuación, limpia la memoria más allá del límite. Este método evita la marca - a algoritmos de limpiar los escombros, sino también para evitar problemas de espacio algoritmo de replicación.
    Después de realizar la generación de GC en general más jóvenes, habrá una pequeña cantidad de objetos vivos, copiará el algoritmo de selección, sólo para pagar una pequeña cantidad de los costos de los objetos de replicación en vivo para completar la colección. La vieja era debido a la alta tasa de supervivencia del objeto, no hay espacio adicional asignado demasiada memoria, es necesario utilizar la marca - para limpiar o marca - algoritmos de ordenación para recuperarse.

memoria de almacenamiento dinámico de Java y el desbordamiento!  enseñarle un truco nirvana

El recolector de basura

  • colector de serie (serie)
    colectores de mayor edad, un único subproceso. Cuando recogida, el subproceso de trabajo debe suspender la aplicación hasta el final de la colección.
  • colector Paralelo (Parallel)
    múltiples hilos en el trabajo de recogida de basura en paralelo, una mayor eficiencia en la CPU multi-núcleo, los hilos de aplicación todavía pendiente.
  • Recolector del CMS (concurrente marca y barrido)
    colector CMS es acortar el tiempo para suspender la aplicación diseñada para el objetivo, basado en la marca - algoritmo de barrido, todo el proceso se divide en cuatro pasos, incluyendo:
    • etiquetas iniciales (Marcar inicial)
    • marca concurrente (concurrente Mark)
    • Relabeled (Observación)
    • concurrente Clear (Sweep concurrente)

Entre ellos, el marcador, re-marca inicial de estos dos pasos todavía tienen que hacer una pausa en el subproceso de la aplicación. La marca inicial solo marca qué objetos se pueden vincular directamente a las raíces de GC, muy rápido, fase marca concurrente está marcado objetos reciclables, y la fase de re-marca es correcta durante la marca concurrente debido a la operación del programa de usuario continúa produciendo como resultado cambios marcados en la parte de la marca objeto de registro, esta etapa de pausa un poco más larga que la fase inicial marca, pero periodo de tiempo marca mucho más concurrente.
Dado que todo el proceso de consumo de la marca concurrente más larga y claro proceso de recogida de hilos concurrentes pueden trabajar juntos con el hilo de usuario, por lo que, CMS colector de recogida de basura con la ejecución concurrente del usuario, reduciendo en gran medida el tiempo de pausa.

  • G1 colector (Garbage primero)
    pila G1 se separará región colector (región) de memoria se divide en una pluralidad de igual tamaño, y puede predecir el tiempo de pausa, se puede predecir la razón de evitar toda la región montón recogido. pista G1 Región individual de basura amontonadas en el valor de tamaño (obtenido por el espacio y el tiempo necesario para la recuperación), en el fondo para mantener una lista de prioridades, de acuerdo a cada tiempo de recogida permitido, la mayor recuperación de prioridad valor Región, lo que garantiza mayor tiempo limitado dentro de una mayor eficiencia de recolección.
    proyecto de trabajo G1 colector se divide en cuatro pasos, incluyendo:
    • etiquetas iniciales (Marcar inicial)
    • marca concurrente (concurrente Mark)
    • La marca de final (nota final)
    • Reciclaje de filtro (contaje de datos en vivo y Evacuación)

La marca inicial con CMS, ya que marca el objeto puede estar vinculada directamente a las raíces de GC. marca concurrente de GC Raíz marcan el inicio de objetos vivos, esta fase requiere más tiempo, pero también se puede realizar simultáneamente con hebras de la aplicación. La nota final también a las modificaciones realizadas en la marca concurrente debido a la continuidad del funcionamiento del programa de usuario como resultado de esa parte de la marca de registro de cambio de marca de los productos. Finalmente, tipo el valor reciclaje de cada región y la recuperación de costes en la etapa de cribado para recuperar el usuario para realizar las pausas GC deseados.

Los parámetros recolector de basura

parámetros descripción
-XX: + UseSerialGC colector de serie
-XX: + UseParallelGC colector paralelo
-XX: + UseParallelGCThreads = 8 El número de hilos paralelos colector, mientras que el número de hilos para la recogida de basura, en general, igual al número de CPU
-XX: + UseParallelOldGC Especifica el colector paralelo en nombre de las personas mayores
-XX: + UseConcMarkSweepGC CMS colector (colector concurrente)
-XX: + UseCMSCompactAtFullCollection la compresión del espacio abierto y consolidación de la memoria, para evitar la fragmentación de memoria excesiva
-XX: CMSFullGCsBeforeCompaction = 0 Indica el inicio de la compresión y cuántas veces después de terminar completa GC, 0 representa la compresión se realiza inmediatamente después de cada GC y el acabado completo
-XX: CMSInitiatingOccupancyFraction = 80% Indica que el espacio de memoria utilizando el viejo CMS comenzar a recoger el 80%, para evitar el exceso de Full GC
-XX: + UseG1GC colector G1
-XX: MaxTenuringThreshold = 0 Después de varios GC sigue vivo en la generación joven, para entrar en la vieja era, 0 significa acceso directo al año viejo

¿Por qué sería de desbordamiento del montón?

En la generación más joven sigue vivo después de GC después de un objeto se copia en la vieja era. Años cuando no hay suficiente espacio, años de edad JVM colección completa de basura (GC completa). Si el GC, aún no se puede almacenar objetos de las áreas superviviente más, habrá OOM (Out of Memory).

OOM (Out of Memory) anormalidades son comunes por varias razones:
1) el viejo año fuera de la memoria: java.lang.OutOfMemoryError: Javaheapspace
menos de 2) la generación permanente de la memoria: java.lang.OutOfMemoryError: PermGenspace
3) Código de error, puede no ocupa memoria recuperación oportuna.
OOM son probable que ocurra en estas áreas de memoria, la OOM encuentro real, que puede ser ubicado en zonas de desbordamiento de memoria de acuerdo con la información de anomalía.
Mediante la adición de un -XX parámetro: + HeapDumpOnOutMemoryError, de modo que el aparece de máquinas virtuales volcar la instantánea actual del volcado del montón excepción de desbordamiento de memoria para el análisis post-mortem.

Familiarizado con los parámetros de gestión de memoria JAVA y configuración, la siguiente es una aplicación Java opciones de optimización configuración de lanzamiento:

 
  1. JAVA_OPTS="-server -Xms512m -Xmx2g -XX:+UseG1GC -XX:SurvivorRatio=6 -XX:MaxGCPauseMillis=400 -XX:G1ReservePercent=15 -XX:ParallelGCThreads=4 -XX:

  2. ConcGCThreads=1 -XX:InitiatingHeapOccupancyPercent=40 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:../logs/gc.log"

  • mínimo y máximo de memoria heap, la máxima utilización del conjunto de referencia histórica
  • Configuración del colector de basura GC para el G1
  • GC registro está habilitado, para facilitar el análisis post

resumen

  • Seleccionar algoritmo GC eficiente puede reducir efectivamente las hebras de la aplicación de tiempo de parada.
  • GC completa se detiene a menudo aumentará el tiempo y la utilización de la CPU, se puede aumentar el tamaño del antiguo espacio inferior, pero aumenta el tiempo de recuperación de Full GC, de acuerdo con la elección apropiada de negocio.
Publicados 776 artículos originales · elogios ganado 50 · Vistas de 150.000 +

Supongo que te gusta

Origin blog.csdn.net/weixin_44018338/article/details/105147042
Recomendado
Clasificación