Prefacio:
En la sección anterior, introdujimos el modelo de memoria JVM, el algoritmo de recolección de elementos no utilizados común y la nueva generación de recolectores de elementos no utilizados. Este artículo resumirá aún más el recolector de elementos no utilizados del Geril, cómo elegir el recolector de elementos no utilizados adecuado y el ajuste de parámetros JVM.
En primer lugar, recolector de basura senior
1.1 Recolector de basura antiguo en serie
Serial Old Collector es un recolector de elementos no utilizados de un solo subproceso que trabaja en el senil. Es diferente de Serial para adoptar un algoritmo de acabado de etiquetas.
Uso de escenarios: mediante el recopilador serie en modo cliente, si utiliza el modo servidor, puede usarlo con el recopilador de scavenge paralelo. El otro es un plan de copia de seguridad para CMS y se utiliza en el error del modo CircurRrent.
Proceso de recogida:
1.2 Viejo paralelo
Parallel Old Collector es una versión senil del colector Parallel Scavenge, utilizando etiquetas multiproceso: algoritmos organizativos para el reciclaje de elementos no utilizados, un rendimiento más centrado.
Escenario de uso: para reemplazar el Scanvenge serial antiguo y paralelo
Proceso de recogida:
1.3 CMS= Barrido de marca concurrente
El colector CMS es un recopilador para obtener el tiempo de pausa más corto, utilizando un algoritmo de eliminación de etiquetas. Adecuado para las esperanzas de que el sistema es más corto, dar al usuario una mejor escena de experiencia.
Pasos de reciclaje:
- Etiqueta inicial: Mark GC Roots puede asociar directamente objetos. STW;
- Y publicado y: GC Roots Tracing, se puede ejecutar con el subproceso de usuario, no hay STW;
- Re-marcado: El nuevo juicio de la supervivencia del objeto generado durante la etiqueta, fijar la marca de estos objetos, el tiempo de ejecución es corto, hay STW;
- Autorización de simultaneidad: borre el objeto de elementos no utilizados y ejecútelo con el subproceso de usuario.
Desventajas de los colectores CMS:
- Sensible a los recursos de CPU, porque hay un proceso de concurrencia y limpieza y limpieza;
- No se puede procesar la basura flotante. ERROR DE MODO SIMULTÁNEO puede causar otra producción de GC completo, porque el subproceso de usuario todavía se está ejecutando, por lo que la nueva basura durante este período continuará, esta parte es la llamada basura flotante, sólo en el siguiente GC Limpiarlo de nuevo;
- Con un algoritmo de eliminación de etiquetas, se genera fragmento de residuo. Memory Debris conduce a objetos grandes que no se pueden asignar en un espacio de memoria consecutivo, lo que puede desencadenar Full GC, lo que afecta al rendimiento de la aplicación.
Coleccionista de 1,4 G1
A partir de JDK 9, el recolector de elementos no utilizados predeterminado de JVM se ajusta de Parallel GC a G1 y se suprime completamente CMS. Restringir o reducir las pausas de GC más importantes que el rendimiento del sistema, cambiar de PGC a G1 de bajo retardo puede traer una mejor experiencia a la mayoría de los usuarios. El rendimiento de G1 se ha optimizado en gran medida en JDK 8 y versiones de versión posteriores, G1 es un recolector de elementos no utilizados con todas las características de GC, por lo que G1 se establece en el GC predeterminado de JVM. De acuerdo con las instrucciones en JEP-291, con el fin de reducir la carga de mantenimiento del código GC y acelerar las nuevas características, el CMS GC se determina en JDK 9.
La partición de memoria del recolector de elementos no utilizados G1 ya no utiliza particiones de memoria tradicionales y cancela la nueva generación, el espacio fisiológico del senil. En su lugar, la memoria de pila se divide en varias regiones. Al recoger cada vez, solo se recogen varios de ellos y se controla el STW generado por la recuperación de elementos no utilizados. Y la mayor diferencia entre los recolectores de basura tradicionales es que debilitan el concepto de separación, introduciendo la idea de partición.
Pasos de recogida:
- Marcador inicial. Recoger todas las raíces gc, habrá STW, que se completa en la generación joven;
- Y publicar y marcar objetos de supervivencia;
- Etiqueta final, la última fase de marcado, STW, tiempo, completar todas las etiquetas
- Detección de reciclaje, reciclaje región sin objetos de supervivencia y añade colas de región disponibles.
Diagrama de proceso de recopilación:
Usar algoritmo: utilice un algoritmo de replicación en tópicamente para usar un algoritmo mark-organizer.
Ventaja:
«Paralelo y simultáneo»: G1 puede hacer pleno uso de las ventajas de hardware en múltiples CPU, entorno multinúcleo, utilizando múltiples CPU para acortar el tiempo de pausa stop-the-world. Parte del recopilador originalmente necesario para detener los subprocesos Java para realizar la acción GC, el recopilador G1 todavía puede permitir que los programas Java continúen ejecutándose de forma simultánea.
«Colección de ellos»: G1 puede administrar todo el montón de Java solo, y utilizar diferentes maneras de procesar objetos recién creados y han sobrevivido durante un tiempo, y los objetos antiguos de varios GCs se han utilizado para obtener mejores efectos de colección.
«Integración espacial»: Los residuos espaciales no se generarán durante el funcionamiento de G1, y la memoria disponible regular se puede proporcionar después de la recolección.
«Pausa predecible»: G1 Además de perseguir la parada baja, también puede establecer un modelo de tiempo de pausa predecible. Puede hacer que el usuario especifique claramente que el tiempo que consume la recolección de elementos no utilizados dentro de un período de milisegundos M no debe superar los milisegundos N.
1.5 ZGC
JDK11 se une, actualmente en la etapa experimental, no a una introducción detallada aquí.
En segundo lugar, la relación entre el recolector de basura
Nueva generación: Serial, Parnew, Parallel Scanvenge
Senior: Serial Old, Parallel Old, CMS
Coleccionista de montón entero: G1, ZGC
Tercero, Minor GC / MAJOR GC / FULL GC
GC menor: El GC que ocurre en la generación joven se convierte en GC menor. Debido a que la mayoría de los objetos de Java son dinastía, el GC menor es muy frecuente, y la velocidad de recuperación general también es más rápida.
GC principal: Envejecido en el senil, a menudo acompañado por al menos una vez GC menor, la velocidad de GC mayor es generalmente más de diez veces mayor que el GC menor
GC completo: La ocurrencia en la nueva generación + senior.
Cuarto, activar condiciones de GC completo
Sistema de llamadas.gc
2. El espacio antiguo es insuficiente:
El antiguo espacio nacido sólo tiene un fenómeno insuficiente cuando la nueva generación de objetos se transfiere y se crea como objetos grandes y cuando se ejecuta el FULL.GcDespués de que el espacio sigue siendo insuficiente, se produce el siguiente error:Java.lang. OutOfMemoryError: Java HEAP Space debe intentar que el objeto sea recuperado durante la fase de GC menor al ajustar las dos condiciones anteriores, permitiendo que el objeto sobreviva en la nueva generación y no cree excesivamente objetos y matrices.
3. El espacio permanente está lleno:
PermanenteGenEn la ERATION, cierta información de clase, etc., cuando la clase, las clases reflejadas y los métodos de llamada que se cargarán, PermanetGenLa eración puede ser contabilizada, no configurada para adoptarCms El GC completo se llevará a cabo en el caso de GC. Si el GC completo todavía se recupera, entoncesJvmLanzará el siguiente mensaje de error:Java.lang.outofmemoryError: Espacio de Permgen Para evitar que Perm Gen cause fenómenos gc completos, el método se puede utilizar para aumentar el espacio de Perm Gen o para usar.Cms Gc.
4. El tamaño medio del GC menor obtenido estadísticamente es mayor que el espacio restante de la vida antigua;
5. Al replicar desde el área Edén, el distrito Desde espacio se replica en el área Espacio, el tamaño del objeto es mayor que el espacio de la memoria disponible, y el objeto se transfiere al senil, y la memoria disponible en el extranjero es menor que el tamaño del objeto. Es decir, cuando la vejez no puede salvar, el GC completo activará el GC completo cuando el nuevo año sea demasiado viejo.
Cinco, Edén de Nueva Generación: S1: S2 Por qué es 8:1:1
Memoria disponible en la nueva generación: La memoria utilizada para garantizar 9:1, por lo que sólo causará el 10% de los residuos espaciales. El área Edén: S1 es 8:1 en la nueva generación de Eden: S1: S2 = 8:1:1, está configurado por parámetros – xx: survivorratio (predeterminado 8).
6. ¿Cómo elegir un recolector de elementos no utilizados?
Los diferentes recolectores de basura tienen sus propias ventajas y desventajas, no hay un bien absoluto, necesitamos combinar situaciones específicas en la práctica. Estas son algunas sugerencias de elección:
1. Si el tamaño del montón no es muy grande, seleccione la mayor eficiencia de los colectores serie. Parámetros de ajuste: -xx: + useserialgc
2. Si la aplicación se ejecuta en un solo núcleo, o el núcleo asignado por la máquina virtual es solo un núcleo, la selección de un serial sigue siendo la más adecuada;
3. Si la aplicación es un buen momento, y no hay una solicitud especial para un estacionamiento más largo, seleccione el colector serie es mejor. Parámetros de ajuste – xx: + useparallelgc
4. Si la aplicación requiere un tiempo de respuesta alto, desea menos pausa. Incluso una segunda pausa causará una gran cantidad de error de solicitud, a continuación, elija G1, ZGC, y CMS son razonables. Aunque estas pausas de GC de recopiladores suelen ser relativamente cortas, requiere algunos recursos adicionales para lidiar con estos trabajos, por lo general el rendimiento será bajo. Parámetros: -xx: + UseconcmarksWeepg, -xx: + useg1gc, -xx: + usezgc, etc.
.