Directorio
- Recolector de basura
- 1. Serie (nueva generación)
- 2. ParNew (nueva generación)
- 3. Scanvenge paralelo (nueva generación)
- 4. Paralelo viejo
- 5. Serie antigua
- 6. CMS (Vejez)
- 七 、 Basura primero (G1)
- Algunas preguntas
- Proceso de ejecución
- Características y ventajas:
- Desventajas (en comparación con CMS)
- JVM observa (1) área de memoria java y desbordamiento de memoria y creación, diseño y posicionamiento de objetos
- Notas de JVM (2) La vida y muerte de los objetos y las cuatro principales referencias a Java
- JVM observa (3) el algoritmo de recolección de basura y la implementación del algoritmo HotSpot (punto de seguridad, conjunto de memoria y tabla de tarjetas, barrera de escritura, marca de tres colores, etc.)
- JVM observa (cinco) mecanismo de carga de clases, cargador de clases y mecanismo de delegación principal
Recolector de basura
1. Serie (nueva generación)
1. Subproceso único (todos los otros subprocesos deben suspenderse durante la recopilación)
2. El recopilador predeterminado en modo cliente también es una buena opción
Ventajas:
1. Simple y eficiente (en comparación con el hilo único de otros coleccionistas)
2. Cuando los recursos de memoria son limitados, el consumo de memoria adicional es mínimo
3. Debido a que no hay sobrecarga de interacción de subprocesos, se puede obtener la mayor eficiencia de subprocesos
2. ParNew (nueva generación)
Es una versión multiproceso de Serial.
Colección paralela multiproceso, el resto es lo mismo que Serie
-
Colección paralela multiproceso (el proceso del usuario debe esperar)
-
Actualmente único que puede trabajar con el colector CMS trabajo
Use los
-XX:+UseConcMarkSweepGC
parámetros, use la combinación de colector ParNew + CMS + Serial Old , en este momento ParNew es el colector predeterminado de la nueva generación -
El número de subprocesos de recopilación habilitados de forma predeterminada es el mismo que el número de núcleos de procesador.
Puede usar
-XX:ParallelGCThreads
parámetros para limitar la cantidad de hilos
El uso eficiente de los recursos del sistema durante la recolección de basura es muy beneficioso.
Combinaciones canceladas después de JDK9 :
- ParNew + CMS (no cancelado, pero no recomendado como combinación de recopilador en modo servidor)
- ParNew + Serial Old
- Serie + CMS
Por lo tanto, solo ParNew y CMS se pueden combinar, también se puede entender que ParNew se incorpora a CMS
3. Scanvenge paralelo (nueva generación)
1. Replicación basada en marcas
2. Colección paralela
3. Centrarse en el rendimiento
Adecuado para tareas en segundo plano sin demasiada interacción.
Parámetros relacionados
-
-XX: MaxGCPauseMillis
Número de milisegundos mayor que 0
Tiempo máximo de pausa de recolección de basura (a expensas del tamaño de la generación joven, cada tiempo de pausa es corto, pero hace que el GC sea más frecuente y reduce el rendimiento)
-
-XX: GCTimeRatio
0-100 Entero: la relación entre el tiempo de recolección de basura y el tiempo total. El concepto original del libro es un poco desordenado y no es fácil de entender.
Pero siempre que el valor del parámetro N se calcule mediante la fórmula: 1/1 + N , se calcula la relación entre el tiempo de recolección de basura y el tiempo total, y N en sí no es la relación
Si el parámetro es 49: Rendimiento = 1-1 / (1 + 49) = 1-1 / 50 = 98% 1/50 es la proporción del tiempo de recolección de basura
-
-XX: UseAdaptiveSizePolicy
Active este parámetro, no necesita especificar el nuevo tamaño de generación (-Xmn), -XX: SurvivorRatio, -XX: PretenureSizeThreshold y otros parámetros, solo necesita especificar un objetivo de optimización: como el montón máximo -Xmx, y los parámetros anteriores 1 o 2, especifique el foco El tiempo de pausa o el rendimiento, el sistema ajustará dinámicamente los parámetros relevantes, esto se llama la estrategia de ajuste adaptativo de la recolección de basura
4. Paralelo viejo
Versión de generación anterior de Scavenge paralelo
- Colección concurrente multiproceso
- Clasificación basada en marcas
- Centrarse en el rendimiento (Paralelo Scanvenge + Paralelo antiguo)
5. Serie antigua
Versión de la generación anterior de serie
1. hilo único
2. Marcado
3. Igual que Serial para modo cliente
4. Como plan de respaldo cuando falla el recopilador de CMS
Diagrama de proceso de trabajo referencia uno, colector en serie
6. CMS (Vejez)
Preste atención al tiempo de pausa -> Ofrezca a los usuarios una buena experiencia interactiva en modo servidor como B / S
Proceso de operación
1. Marca inicial
2. Marca concurrente
3. Observación
4. Barrido concurrente (barrido concurrente)
1. Marcado inicial: marcado de objetos directamente asociados con GCRoots, rápido
2. Marcado concurrente: comience a recorrer todo el gráfico de objetos de los objetos directamente asociados con GCRoots, sin suspender hilos de usuario, y ejecutar simultáneamente con hilos GC, lo que lleva mucho tiempo
3. Remarcado: corrige el objeto cuya marca cambia debido al hilo del usuario durante el marcado concurrente
4. Eliminación simultánea: elimina los objetos marcados como muertos y puede ejecutarse simultáneamente con el programa de usuario
Desventajas
-
Sensible a los recursos de la CPU
El número de subprocesos de reciclaje iniciados por el CMS de forma predeterminada es ** (número de CPU +3) / 4 **. Por lo tanto, cuanto menor sea el número de CPU, menor será la velocidad de ejecución de los programas de usuario.
-
Incapaz de manejar basura flotante
Debido a que el programa de usuario aún debe ejecutarse en las dos etapas concurrentes, se generarán nuevos objetos basura, y estos objetos solo se pueden recolectar en el próximo GC porque aparecen después de la marca. Estos son basura flotante.
-
El CMS no puede esperar hasta que los objetos de la generación anterior estén llenos.
-
Parámetros
-XX:CMSInitiatingOccupancyFraction
: establezca el umbral activado por CMS. En jdk1.6, el umbral predeterminado de CMS se eleva al 92%. -
-XX: + UseCMSInitiatingOccupancyOnly : el valor predeterminado es falso. Si no se usa, el umbral establecido anteriormente se usará solo una vez, y se ajustará automáticamente más tarde; si se usa, el umbral establecido siempre se usará.
Puede usar estos dos parámetros juntos:
-XX:CMSInitiatingOccupancyFraction=70 -XX:UseCMSInitiatingOccupancyOnly=true
- Cuando la memoria reservada durante la operación del CMS no puede satisfacer las necesidades del programa, aparecerá "Falla de modo concurrente", y luego el colector de serie antiguo se habilitará temporalmente para la recolección de basura de la generación anterior, por lo que el tiempo de pausa es muy largo, por lo que el valor del parámetro también se establece Alto es fácil de causar una gran cantidad de "Falla de modo concurrente".
Cabe señalar que:
intx CMSInitiatingOccupancyFraction = -1 {product}
El valor predeterminado de este parámetro es -1 en jdk1.8, y el 92% se calcula de la siguiente manera:
void ConcurrentMarkSweepGeneration::init_initiating_occupancy(intx io, uintx tr) { assert(io <= 100 && tr <= 100, "Check the arguments"); if (io >= 0) { _initiating_occupancy = (double)io / 100.0; } else { _initiating_occupancy = ((100 - MinHeapFreeRatio) + (double)(tr * MinHeapFreeRatio) / 100.0) / 100.0; } }
-
Si el valor del parámetro es mayor o igual a 0, el porcentaje se usa como parámetro
-
Si menos de 0, de acuerdo con
MinHeapFreeRatio
ytr
calculado según la fórmula anterior,MinHeapFreeRatio
se reducirá el montón (no válido -Xms = -Xmx) para el tamaño del montón de lograr este porcentaje, es decir TRCMSTriggerRatio
, el valor predeterminado se encuentra para ver estos dos parámetros:uintx MinHeapFreeRatio = 40 {manageable} uintx CMSTriggerRatio = 80 {product}
Por lo tanto, el porcentaje de CMS activado es: ((100-40) + (80 * 40) / 100) /100=0.92=92%
-
-
Los desechos espaciales existen porque se basan en un algoritmo de marcado y barrido
- -XX: + UseCMSCompactAtFullCollection : la desfragmentación en FullGC, exclusiva no puede ser concurrente, hará que el tiempo de pausa sea más largo, JDK9 comenzó a abandonarse
- -XX: + CMSFullGCsBeforeCompaction configurado para desfragmentar después de algunos FullGC
Resumen
El umbral de activación de CMS no puede ser demasiado grande, de lo contrario provocará un fallo de concurrencia, y puede que no sea demasiado pequeño, lo que provocará frecuentes activadores de CMS, y la marca inicial y el remarcado (que requieren mucho tiempo) de CMS provocarán Stop The World. Aumente el tiempo de pausa, que puede configurarse en 70
七 、 Basura primero (G1)
1. Orientación servidor (JDK9 empezar como el recolector de basura por defecto en modo servidor, CMS eran Desaprobar)
2. Para que cualquier parte de la memoria de almacenamiento dinámico forme una colección (CSet), el estándar de medición se convierte en qué pieza de memoria tiene la mayor cantidad de basura almacenada y los ingresos máximos de recuperación
-
G1 divide el montón en regiones independientes de igual tamaño (Región). Cada región puede jugar eden, sobreviviente y la generación anterior. El recolector puede tomar diferentes regiones estratégicas para regiones con diferentes roles. La región es la unidad más pequeña de recuperación individual Es decir, cada vez que el espacio de memoria recuperado es un múltiplo entero de la región
-
La región Humongous (considerada como la generación anterior) en la Región se usa para almacenar objetos grandes , siempre que un objeto con más de la mitad de la capacidad de una región pueda llamarse un objeto grande
Los parámetros de
-XX:G1HeapRegionSize
parámetros pueden especificar el tamaño de cada región, rango:1M~32M
potencia de 2 vecesLos objetos de gran tamaño en toda la región se colocan en forma homogénea consecutiva
-
G1 mantiene una lista de prioridades de acuerdo con el valor de la basura en cada región (es decir, el valor de la experiencia del espacio obtenido y el tiempo requerido para el reciclaje), y preferentemente recicla las regiones con gran valor de acuerdo con el tiempo de pausa establecido por el usuario
Algunas preguntas
-
G1 usa conjuntos de memoria para evitar escaneos completos de la pila
-
La fase de marcado concurrente asegura que el hilo de recopilación y el hilo de usuario no interfieran entre sí:
G1 utiliza el método de instantánea original para garantizar que cuando el hilo del usuario cambie la relación de referencia, la estructura del gráfico del objeto original no se destruya, asegurando la corrección de la marca. Consulte 4.6 arriba (instantánea original)
- G1 diseñó dos punteros TAMS (Top At Mark Start) para cada región
- Espacio de partición para la asignación de nuevos objetos generados durante la recopilación concurrente
- La nueva dirección del objeto debe estar por encima de dos posiciones de puntero
- Los objetos G1 sobre esta dirección están vivos por defecto
- Cuando la velocidad de asignación de objetos excede la velocidad de recuperación, el hilo del usuario se congela y se genera un GC completo
Proceso de ejecución
-
Marca inicial
Marque los objetos directamente relacionados con GCRoots, modifique el valor del puntero TAMS, de modo que cuando el proceso del usuario se ejecute simultáneamente en la siguiente etapa, se puedan asignar nuevos objetos en las regiones disponibles. Como antes, se requiere STW, pero lleva poco tiempo y se completa sincrónicamente con la ayuda de MinorGC, por lo que G1 no requiere pausas adicionales en esta etapa.
-
Marca concurrente
A partir de los objetos directamente relacionados con GCRoots, el análisis de accesibilidad del gráfico de objetos se realiza para descubrir los objetos que se recuperarán, lo que lleva mucho tiempo.
Se puede ejecutar simultáneamente con el proceso del usuario. Una vez que se completa el escaneo, es necesario volver a procesar los objetos modificados referenciados concurrentes grabados por SATB (instantánea original).
-
Nota final
Otra breve pausa en el hilo del usuario se usa para procesar una pequeña cantidad de registros SATB que quedan después de que finaliza la fase de concurrencia.
-
Cribado y reciclaje
- Actualizar estadísticas de la región
- Ordenar todas las regiones por valor de reciclaje y costo
- Haga un plan de reciclaje de acuerdo con el tiempo de pausa establecido por el usuario
- Seleccione libremente varias regiones como colección posterior, copie los objetos supervivientes de la región determinada en otra región vacía y luego limpie toda la región antigua
- El proceso del usuario debe suspenderse , y se pueden ejecutar múltiples recopiladores en paralelo.
Actualizar-> Ordenar-> Desarrollar plan de reciclaje-> Seleccionar colección posterior-> Copia de limpieza (Paralelo, STW)
Además del marcado concurrente, todos los procesos del usuario deben detenerse.
El diagrama esquemático es el siguiente:
Características y ventajas:
-
Obtenga el mayor rendimiento posible con un retraso controlado.
-
El usuario puede especificar el tiempo de pausa esperado (para cumplir con el real)
El valor predeterminado es 200 ms, que no puede ser demasiado bajo. Demasiado bajo hará que cada colección seleccionada ocupe solo una pequeña parte del montón, y la velocidad de recuperación no puede mantenerse al día con la velocidad de asignación, lo que resulta en un GC completo
-
Memoria de almacenamiento dinámico de gestión de partición (región)
-
Determinar el retorno a la recolección de acuerdo con la eficiencia del reciclaje
-
El todo se basa en la organización de marcas, y el parcial se basa en la copia de marcas, sin fragmentación.
Desventajas (en comparación con CMS)
-
Uso de la memoria
Debido a que cada región necesita mantener una tabla de tarjetas para resolver el problema de referencia de generación cruzada, el conjunto de memoria puede representar más del 20% del montón completo. CMS tiene solo un formulario de tarjeta.
-
Alta carga de ejecución adicional
Al igual que con CMS, las barreras de escritura se utilizan para mantener la tabla de tarjetas.
Además de usar la barrera posterior a la escritura como CMS (usando la sincronización directamente), G1 también requiere la barrera previa a la escritura para implementar el algoritmo de instantánea original, lo que crea una carga adicional. (Usar la cola de mensajes)
La aplicación de memoria pequeña CMS tiene una alta probabilidad debido a G1
================================================== ====================
Otras notas relacionadas:
JVM observa (1) área de memoria java y desbordamiento de memoria y creación, diseño y posicionamiento de objetos
Notas de JVM (2) La vida y muerte de los objetos y las cuatro principales referencias a Java
JVM observa (3) el algoritmo de recolección de basura y la implementación del algoritmo HotSpot (punto de seguridad, conjunto de memoria y tabla de tarjetas, barrera de escritura, marca de tres colores, etc.)
JVM observa (cinco) mecanismo de carga de clases, cargador de clases y mecanismo de delegación principal
================================================== ==============
Referencia:
"Comprensión profunda de la tercera edición de la máquina virtual de Java"