"Comprensión profunda de la máquina virtual" leyendo notas-recolector de basura

Recolector de basura

  • Resumen
    • Los representantes conectados se pueden combinar

    • Paralelo Scanvenge y G1 no utilizan el marco de código tradicional de gc collector, el resto comparte algún código de marco
  • Concurrencia y paralelismo
    • Paralelo (Paralelo): se refiere a varios subprocesos de recolección de basura que funcionan en paralelo, pero en este momento el subproceso de usuario todavía está en estado de espera.
    • Concurrente: se refiere a la ejecución simultánea de subprocesos de usuario y subprocesos de recolección de basura (pero no necesariamente paralelos, y pueden ejecutarse alternativamente), los programas de usuario continúan ejecutándose y los programas de recolección de basura se ejecutan en otra CPU
  • Colector en serie
    • El colector más básico y antiguo es la única opción para la colección de nueva generación anterior a 1.3.1
    • Colector de subproceso único: solo hay un subproceso de recolección para realizar la recolección de elementos no utilizados, y todos los demás subprocesos de trabajo deben suspenderse.
    • El recopilador predeterminado de nueva generación en modo Cliente es simple y eficiente, adecuado para un solo entorno de CPU.
    • Diagrama esquemático del flujo de trabajo del colector en serie

  • ParNew collector
    • Versión multiproceso del colector en serie
      • Diferente: múltiples hilos realizan recolección de basura
      • Lo mismo
        • Parámetros de control: -XX: SurvivroRatio / -XX: PretenureSizeThreshold / -XX: HandlePromotionFailure, etc.
        • Algoritmo de recogida
        • STW
        • Reglas de asignación de objetos
        • Estrategia de reciclaje
    • Se prefiere la nueva generación en modo Servidor y se puede usar junto con el recopilador CMS.
    • Use el recopilador predeterminado de nueva generación después de -XX: UserConcMarkSweepGC, o use -XX: UseParNewGC para forzar el uso
    • El rendimiento bajo una sola CPU no es necesariamente mejor que el de serie, pero a medida que aumenta el número de CPU, mejor será el uso efectivo de los recursos del sistema durante la GC.
      • El número predeterminado de subprocesos abiertos es el mismo que el número de CPU
      • -XX: ParallelGCThreads limitan el número de subprocesos de recolección de basura
    • Diagrama de flujo de trabajo del colector ParNew

  • Recolector de tesoros paralelos
    • El nuevo colector multihilo paralelo de generación del algoritmo de replicación, "primer rendimiento"
    • El objetivo del recopilador es lograr un rendimiento controlable (rendimiento = tiempo de ejecución del código de usuario / tiempo de consumo total de la CPU)
    • Uso eficiente del tiempo de CPU para completar la tarea de cálculo del programa lo antes posible, principalmente adecuado para tareas que no requieren demasiada interacción en el cálculo de fondo.
    • Parámetros principales
      • -XX: MaxGCPauseMills
        • Controla el tiempo máximo de pausa de recolección de basura
        • Para milisegundos mayores que 0, el tiempo de pausa del GC se acorta a expensas del rendimiento y el espacio de nueva generación
      • -XX: GCTimeRatio
        • Establezca el tamaño de rendimiento, el valor predeterminado es 99
        • Un entero mayor que 0 y menor que 100, es decir, la relación entre el tiempo de recolección de basura y el tiempo total, el inverso del rendimiento
        • Si se establece en N, el tiempo máximo de GC permitido es N / (N + 1)
      • -XX: + UseAdaptiveSizePolicy
        • Estrategia de Regulación Adaptativa de GC (GC Ergonomics)
        • No es necesario establecer manualmente los parámetros, como el tamaño de la nueva generación, la relación de partición de la nueva generación y el tamaño de los objetos en la generación anterior. La máquina virtual recopila información de monitoreo del rendimiento de acuerdo con la operación del sistema y ajusta dinámicamente los parámetros para proporcionar el tiempo de pausa más adecuado o el rendimiento máximo
        • Simplemente configure los parámetros básicos de memoria y establezca -XX: MaxGCPauseMills o -XX: GCTimeRatio como el objetivo de optimización de la máquina virtual.
  • Coleccionista antiguo en serie
    • La versión de la generación anterior del recopilador en serie, utilizando el algoritmo "mark-sort"
    • Utilizado principalmente en la máquina virtual en modo Cliente
    • El rol del modo Servidor
      • JDk1.5 y antes usado con la colección Parallel Scavenge
      • Como plan de copia de seguridad para el recopilador de CMS, se utiliza cuando se produce una falla de modo concurrente en la recopilación simultánea.
    • Diagrama esquemático del flujo de trabajo del antiguo colector en serie

  • Paralelo viejo coleccionista
    • La versión de la generación anterior del colector Parallel Scavenge utiliza algoritmos de subprocesamiento múltiple y "organización de marcas".
    • Utilizado principalmente con el barrido paralelo.
  • CMS (Concurrent Mark Sweep) colector
    • Un colector destinado a obtener el menor tiempo de pausa de recuperación.
    • Basado en el algoritmo "Mark-Clear".
    • Proceso
      • Diagrama esquemático del flujo de trabajo del recopilador CMS

      • Marca inicial (marca inicial de CMS) -STW
        • Marcar objetos directamente relacionados con GC Roots
        • El tiempo de pausa es corto.
      • Marca concurrente (marca concurrente CMS)
        • GC Roots Tracing
        • Durante el proceso de marcado concurrente, la operación continua del subproceso de la aplicación hace que se promuevan algunos objetos de la generación nueva a la generación anterior, se cambiarán algunas referencias de objetos de la generación anterior y algunos objetos se asignarán directamente a la generación anterior. La tarjeta se marcará como sucia para escanear en la fase de remarcado.
      • Etapa de limpieza previa
        • Utilizado para marcar objetos que sobrevivieron en la generación anterior, el propósito es hacer que el STW de la fase de remarcado sea lo más corto posible.
        • Los objetivos de esta etapa son los objetos de la generación anterior afectados por el subproceso de la aplicación durante la fase de marcado concurrente, que incluyen: (1) objetos cuya tarjeta está sucia en la generación anterior; (2) objetos de la generación anterior a los que se hace referencia en el área superviviente (desde y hacia). Por lo tanto, esta etapa también necesita escanear la nueva generación + generación anterior.
      • Limpieza previa interrumpible
        • Lo mismo que la fase de "limpieza previa" también es reducir la carga de trabajo de la fase de remarcado.
        • Antes de entrar en la fase de remarcado, intente esperar un GC menor para minimizar el tiempo de pausa de la fase de remarcado.
        • Además, la limpieza previa interrumpible comenzará cuando Eden alcance el 50%. En este momento, todavía hay medio tiempo desde el siguiente gc menor. Esto tiene otro significado, es decir, evitar dos pausas consecutivas en poco tiempo.
        • Si se cumplen las dos condiciones siguientes, la "limpieza previa interrumpible" no está activada
          • El espacio de uso de Eden es mayor que "CMSScheduleRemarkEdenSizeThreshold", el valor predeterminado de este parámetro es 2M;
          • La tasa de uso de Eden es mayor o igual que "CMSScheduleRemarkEdenPenetration", el valor predeterminado de este parámetro es 50%.
        • Si no está satisfecho, ingrese la limpieza previa interrumpible, que se puede ejecutar varias veces, luego hay dos salidas que salen de esta etapa
          • Se establece CMSMaxAbortablePrecleanLoops, y el número de ejecuciones excede este valor, el valor predeterminado de este parámetro es 0;
          • CMSMaxAbortablePrecleanTime, el tiempo para realizar la limpieza previa interrumpible excede este valor, el valor predeterminado de este parámetro es 5000 milisegundos.
        • Puede ser posible interrumpir el proceso de limpieza previa sin esperar a gc menor. Si ingresa a la etapa de remarcado en este momento, hay muchos objetos vivos en la nueva generación, lo que hará que el STW se alargue. Por lo tanto, CMS también proporciona CMSScavengeBeforeRemark Force Minor gc por turno antes de marcar.
      • Observación (comentario de CMS) -STW
        • Para corregir la marca concurrente, el registro de marca de la parte del objeto que cambia la marca debido a la operación del programa de usuario
        • Objeto de nueva generación + Raíces Gc + Objeto de vieja generación correspondiente a la tarjeta marcada como sucia en el frente.
        • El tiempo de pausa es ligeramente más largo que la marca inicial y más corto que la marca concurrente.
      • Barrido concurrente (barrido concurrente CMS)
    • Desventajas
      • Muy sensible a los recursos de la CPU. El número de subprocesos de reciclaje iniciados por defecto es (número de CPU + 3) / 4.
      • No se puede manejar basura flotante.
        • Puede haber una falla de "Falla de modo concurrente" que conduzca a otro gc completo.
        • Después de aparecer en la marca, la operación continua del programa de usuario ha generado nueva basura que no se puede reciclar en este momento.
        • Debido al espacio de memoria reservado, el espacio real utilizado: -XX: CMSInitiatingOccupancyFraction. 1.5 es el 60% de la generación anterior predeterminada; 1.6 es el 92% por defecto.
        • Si la memoria reservada no puede satisfacer la asignación del programa de usuario, provocará un "Fallo de modo concurrente" e iniciará temporalmente el recopilador Serial Old para recopilar la generación anterior.
      • Generará mucha fragmentación de memoria.
        • Si no se pueden encontrar suficientes objetos de asignación de memoria, el GC completo se activa por adelantado.
        • -XX: + UseCMSCompactAtFullCollection
          • Encendido por defecto
          • Cuando el CMS no puede contener el Gc completo, inicie el proceso de fusión de la fragmentación de la memoria. Este proceso no puede ser concurrente.
        • -XX: CMSFullGCsBeforeCompaction
          • El valor predeterminado es 0, es decir, cada vez que se comprime Full Gc
          • Se utiliza para establecer cuántas veces realizar FullGc sin compresión y realizar una vez con compresión.
    • CMS falla de ciclo concurrente
      • Falla en modo concurrente: durante la ejecución del ciclo concurrente, el hilo del usuario todavía se está ejecutando. Si en este momento, si el espacio solicitado por el subproceso de la aplicación a la generación anterior excede el espacio reservado (falla garantizada), se activará la falla del modo concurrente, y luego el ciclo concurrente del CMS se reemplazará por un GC completo para todas las aplicaciones para la recolección de basura Y realizar compresión de espacio. Si establecemos los parámetros UseCMSInitiatingOccupancyOnly y CMSInitiatingOccupancyFraction, donde el valor de CMSInitiatingOccupancyFraction es 70, el espacio reservado es el 30% de la generación anterior.
      • Fracaso de la promoción: cuando la nueva generación está haciendo gc menor, el mecanismo de garantía del CMS necesita confirmar si hay suficiente espacio en la generación anterior para acomodar el objeto a promocionar. Si el mecanismo de garantía encuentra que no es suficiente, informará una falla en modo concurrente. Si el mecanismo de garantía juzga que es suficiente, pero De hecho, debido al problema de fragmentación, es imposible asignarlo, y la promoción se informará como fallida.
      • El espacio de generación permanente (o metaespacio Java 8) está agotado. Por defecto, el CMS no recopilará la generación permanente. Una vez que el espacio de generación permanente esté agotado, se activará el GC completo.
  • Colector G1
    • Colector orientado al servidor
    • Caracteristicas
      • Paralelo y concurrente
        • Aproveche al máximo las ventajas de hardware de los entornos multi-cpu y multi-core. Use múltiples CPU para reducir el tiempo STW.
        • Otros coleccionistas requieren la acción de GC de STW, y G1 aún puede realizarse simultáneamente.
      • Colección generacional
      • Integración espacial
        • Desde el todo se basa en la "marca-organizar", desde el local (entre regiones) se basa en el algoritmo de "copia".
        • El algoritmo anterior significa que no se producirá fragmentación del espacio de memoria durante la operación G1.
      • Pausa predecible
        • Establezca un modelo de tiempo de pausa predecible que permita a los usuarios especificar explícitamente que dentro de un segmento de tiempo de M milisegundos, el tiempo dedicado a la recolección de basura no exceda N milisegundos
    • Diseño de la memoria
      • Región
        • Todo el espacio del montón se divide en varias áreas de memoria de igual tamaño, y cada vez que se asigna el espacio del objeto, la memoria se usa segmento por segmento.
        • Solo conserva los conceptos lógicos de la nueva generación y la vieja generación. Ya no está físicamente aislado, sino una colección de regiones.
        • Cada partición no servirá a una determinada generación, y se puede cambiar entre la generación joven y la generación vieja según sea necesario.
        • En el inicio, puede especificar el tamaño de la partición (1 MB ~ 32 MB, y debe ser una potencia de 2) a través del parámetro -XX: G1HeapRegionSize = n. Por defecto, el montón completo se divide en 2048 particiones.
      • Tarjeta
        • Cada partición se divide en un número de tarjetas de 512 bytes, y las tarjetas que identifican la granularidad más pequeña disponible de la memoria de almacenamiento dinámico se registrarán en la tabla de tarjetas globales.
        • El objeto asignado ocupará varias cartas que son físicamente continuas.
        • Al buscar una referencia a un objeto en una partición, el objeto de referencia se puede encontrar grabando la tarjeta (consulte RSet).
        • Cada vez que se recicla la memoria, se procesa la tarjeta en la partición especificada.
    • La base de los modelos de tiempo predecibles.
      • Puede planear evitar exploraciones de basura de área completa en todo el montón.
      • G1 rastrea el valor de cada región y el valor acumulado (espacio recuperado y el valor de experiencia del tiempo requerido para el reciclaje), mantiene una lista de prioridades y prioriza la región con el valor más alto de acuerdo con el tiempo de recolección permitido.
    • Conjunto recogido
      • Una colección de particiones que se pueden reciclar. Los datos que sobreviven en CSet se moverán a otra partición disponible durante GC. La partición en CSet puede provenir del espacio Eden, el espacio Survivor o la generación anterior. CSet ocupará menos del 1% de todo el espacio de almacenamiento dinámico.
    • Conjunto recordado: evite la exploración completa del montón
      • Cada región tiene un conjunto recordado.
      • Cuando el programa de descubrimiento JVM escribe datos de tipo de referencia, generará una barrera de escritura para interrumpir temporalmente la operación de escritura y verificar si el objeto referenciado está en una región diferente.
      • Si es así, la información de referencia relevante se registra en el Conjunto Recordado de la Región a la que pertenece el objeto referenciado a través de CardTable.
      • Al realizar la recolección de elementos no utilizados, agregue un conjunto recordado al rango de enumeración del nodo raíz del GC para evitar una exploración de montón completa.
      • RSet es en realidad una tabla hash, la clave es la dirección inicial de otra región, el valor es un conjunto y el elemento dentro es el índice de la tabla de tarjetas.
    • Instantánea al comienzo (SATB)
      • SATB es un medio para mantener la exactitud de la GC concurrente. La teoría de concurrencia de G1GC se basa en SATB. Es un algoritmo de marcado diseñado por Taiichi Yuasa para el recolector de basura de eliminación de marca incremental. La optimización de la marca de SATAB está dirigida principalmente al recolector de basura de eliminación de marca. Fase de marcado concurrente. Según el argumento de R: el diseño de actualización incremental de CMS hace que sea necesario volver a escanear todas las pilas de subprocesos y toda la generación joven como raíz durante la fase de observación; el diseño SATB de G1 solo necesita escanear el resto de satb_mark_queue durante la fase de observación.
      • El algoritmo SATB crea un gráfico de objeto, que es una "instantánea" lógica del montón. La estructura de datos de etiqueta incluye dos mapas de bits: el mapa de bits anterior y el siguiente mapa de bits.
      • El mapa de bits anterior guarda la información de marcado completada más recientemente. El siguiente mapa de bits se creará y actualizará en el ciclo de marcado concurrente. A medida que pase el tiempo, el mapa de bits anterior se volverá cada vez más desactualizado. Finalmente, al final del ciclo de marcado concurrente, el siguiente mapa de bits Sobrescribirá el mapa de bits anterior.
      • Pasos
        • El ciclo de concurrencia incluye el marcado inicial, el marcado concurrente y el marcado final.
        • Durante la fase de marcado inicial, el campo NTAMS se establece en la parte superior actual de cada partición. Después del inicio del ciclo concurrente, los objetos asignados se colocarán en los TAMS y se definirán explícitamente como objetos implícitamente vivos, mientras que los objetos bajo los TAMS deben marcarse claramente.
        • Hay un puntero PTAMS en la parte superior e inferior, que indica que está vivo implícitamente al final del ciclo de marcado anterior, y la posición del área del objeto que debe marcarse claramente en el siguiente ciclo, es decir, la posición de NTAMS al final del ciclo de marcado anterior.
        • Después de que comienza el ciclo concurrente, el área del objeto que debe marcarse claramente entre Bottom y PTAMS se registra en el mapa de bits anterior.
        • Los objetos entre Top y PATMS son objetos que sobreviven implícitamente y también se registran en el mapa de bits anterior.
        • Al final de la marca final, se marcarán todos los objetos antes de NTAMS.
        • Los objetos asignados durante la fase de marcado concurrente se asignarán al espacio después de NTAMS, y se registrarán como objetos supervivientes implícitamente en el siguiente mapa de bits. Después de completar un ciclo de marcado concurrente, este siguiente mapa de bits sobrescribirá el mapa de bits anterior y luego borrará el siguiente mapa de bits.
    • Pasos
      • Marca inicial (STW) -STW
        • Marque los objetos directamente asociados con las raíces de GC y modifique el campo NTAMS (Siguiente arriba en Marcar inicio) a la posición superior de la partición actual
        • El tiempo de pausa es corto.
      • Marca concurrente
        • GC Roots Tracing
        • El marcado concurrente utilizará el algoritmo de rastreo para encontrar todos los objetos vivos y registrarlos en un mapa de bits, ya que los objetos por encima de TAMS se consideran implícitamente vivos, por lo que solo necesitamos atravesarlos bajo TAMS;
        • Para registrar los cambios de referencia que ocurrieron en el momento del marcado, la idea de SATB es establecer una instantánea al principio, y luego asumir que la instantánea no cambia, y trazar de acuerdo con esta instantánea.
        • En este momento, si la referencia de un objeto cambia, el valor anterior del objeto debe registrarse en un búfer SATB a través de registros de barrera previos a la escritura.
        • Si el búfer está lleno, agréguelo a una lista global: G1 tendrá hilos marcados simultáneamente para procesar la lista global periódicamente.
      • Marca final (Finalremark) STW
        • Para corregir la marca concurrente, el registro de marca de la parte del objeto cuya marca cambia debido a la operación del programa de usuario.
        • El recolector de basura G1 desechará el búfer de registro SATB restante y todas las referencias actualizadas, al mismo tiempo, el recolector de basura G1 también encontrará todos los objetos vivos sin marcar.
        • La JVM registra los cambios de objetos durante el período en los subprocesos de registros recordados. Finalmente se fusionó con el conjunto recordado.
      • Detección y reciclaje (recuento y evacuación de datos en vivo),
        • Primero ordene de acuerdo con el valor y costo de reciclaje de la Región, y haga un plan de reciclaje de acuerdo con el tiempo de pausa de GC esperado por el usuario.
        • Se permite la concurrencia, pero debido a que solo se recupera una parte de la Región, el tiempo es controlable por el usuario, y suspender los hilos de usuario puede mejorar en gran medida la eficiencia de la recolección.
    • Parámetros relacionados con el recolector de basura
24 artículos originales publicados · Me gusta0 · Visitas100

Supongo que te gusta

Origin blog.csdn.net/jiangxiayouyu/article/details/105614266
Recomendado
Clasificación