in

Primer ajuste del recolector de basura Garbage

Aprenda a adaptar y ajustar el G1 GC para evaluación, análisis y rendimiento.

Garbage First Garbage Collector (G1 GC) es el recolector de basura generacional estilo servidor de pausa baja para Java HotSpot VM. El G1 GC utiliza fases simultáneas y paralelas para lograr su tiempo de pausa objetivo y mantener un buen rendimiento. Cuando G1 GC determina que es necesaria una recolección de basura, primero recopila las regiones con la menor cantidad de datos en vivo (basura primero).

Un recolector de basura (GC) es una herramienta de administración de memoria. El G1 GC logra la gestión automática de la memoria a través de las siguientes operaciones:

  • Asignar objetos a una generación joven y promover objetos antiguos en una generación anterior.
  • Encontrar objetos vivos en la generación anterior a través de una fase de marcado concurrente (paralela). La máquina virtual Java HotSpot activa la fase de marcado cuando la ocupación total del montón de Java supera el umbral predeterminado.
  • Recuperación de memoria libre compactando objetos vivos mediante copia paralela.

Aquí, analizamos cómo adaptar y ajustar el GC G1 para evaluación, análisis y rendimiento; asumimos una comprensión básica de la recolección de basura de Java.

G1 GC es un recolector de basura regionalizado y generacional, lo que significa que el montón de objetos Java (montón) se divide en varias regiones del mismo tamaño. Al iniciarse, la máquina virtual Java (JVM) establece el tamaño de la región. Los tamaños de región pueden variar de 1 MB a 32 MB según el tamaño del montón. El objetivo es no tener más de 2048 regiones. Las generaciones eden, superviviente y viejas son conjuntos lógicos de estas regiones y no son contiguas.

El G1 GC tiene un objetivo de tiempo de pausa que intenta cumplir (tiempo real suave). Durante las colecciones jóvenes, el G1 GC ajusta su generación joven (tamaños eden y superviviente) para cumplir con el objetivo suave en tiempo real. Durante las recolecciones mixtas, el G1 GC ajusta el número de regiones antiguas que se recolectan en función de un número objetivo de recolecciones de basura mixtas, el porcentaje de objetos activos en cada región del montón y el porcentaje de desechos de montón aceptable general.

El G1 GC reduce la fragmentación del montón mediante la copia paralela incremental de objetos en vivo de uno o más conjuntos de regiones (llamado Conjunto de colección (CSet)) en diferentes regiones nuevas para lograr la compactación. El objetivo es recuperar la mayor cantidad de espacio de almacenamiento dinámico posible, comenzando por las regiones que contienen la mayor cantidad de espacio recuperable, mientras se intenta no exceder el objetivo de tiempo de pausa (basura primero).

El G1 GC utiliza conjuntos recordados independientes (RSets) para realizar un seguimiento de las referencias en las regiones. Los RSet independientes permiten la recopilación de regiones paralela e independiente porque solo se debe escanear el RSet de una región en busca de referencias en esa región, en lugar de todo el montón. El G1 GC utiliza una barrera posterior a la escritura para registrar los cambios en el montón y actualizar los RSets.

Fases de recolección de basura

Además de las pausas de evacuación (descritas a continuación) que componen las recolecciones de basura jóvenes y mixtas de stop-the-world (STW), el G1 GC también tiene ciclos de marcado paralelos, concurrentes y multifásicos. G1 GC utiliza el algoritmo Snapshot-At-The-Beginning (SATB), que toma una instantánea del conjunto de objetos vivos en el montón al comienzo de un ciclo de marcado. El conjunto de objetos en vivo se compone de los objetos en vivo en la instantánea y los objetos asignados desde el inicio del ciclo de marcado. El algoritmo de marcado G1 GC utiliza una barrera de preescritura para registrar y marcar objetos que forman parte de la instantánea lógica.

Colecciones de basura joven

G1 GC satisface la mayoría de las solicitudes de asignación de regiones agregadas al conjunto de regiones de eden. Durante una recolección de basura joven, el G1 GC recolecta tanto las regiones del Edén como las regiones supervivientes de la recolección de basura anterior. Los objetos vivos de las regiones del Edén y los supervivientes se copian o evacuan a un nuevo conjunto de regiones. La región de destino de un objeto en particular depende de la edad del objeto; un objeto que ha envejecido lo suficiente se evacua a una región de vieja generación (es decir, promovida); de lo contrario, el objeto se evacúa a una región de supervivientes y se incluirá en el CSet de la siguiente recolección de basura joven o mixta.

Colecciones de basura mixtas

Una vez completado con éxito un ciclo de marcado simultáneo, el G1 GC pasa de realizar recolecciones de basura jóvenes a realizar recolecciones de basura mixtas. En una recolección de basura mixta, el G1 GC agrega opcionalmente algunas regiones antiguas al conjunto de regiones eden y supervivientes que se recolectarán. El número exacto de regiones antiguas agregadas está controlado por una serie de indicadores que se discutirán más adelante (ver «Domesticar GC mixtos«). Después de que G1 GC recopila una cantidad suficiente de regiones antiguas (sobre múltiples recolecciones de basura mixtas), G1 vuelve a realizar recolecciones de basura jóvenes hasta que se completa el siguiente ciclo de marcado.

Fases del ciclo de marcado

El ciclo de marcado tiene las siguientes fases:

  • Fase de calificación inicial: El G1 GC marca las raíces durante esta fase. Esta fase se suma a una recolección de basura joven normal (STW).
  • Fase de exploración de la región raíz: El G1 GC escanea las regiones supervivientes de la marca inicial en busca de referencias a la generación anterior y marca los objetos a los que se hace referencia. Esta fase se ejecuta al mismo tiempo que la aplicación (no STW) y debe completarse antes de que pueda comenzar la siguiente recolección de basura joven de STW.
  • Fase de marcado concurrente: G1 GC busca objetos accesibles (activos) en todo el montón. Esta fase ocurre al mismo tiempo que la aplicación y puede ser interrumpida por recolecciones de basura jóvenes de STW.
  • Fase de observación: Esta fase es la recolección de STW y ayuda a completar el ciclo de calificación. G1 GC drena los búferes SATB, rastrea objetos en vivo no visitados y realiza el procesamiento de referencia.
  • Fase de limpieza: En esta fase final, el G1 GC realiza las operaciones STW de contabilidad y depuración RSet. Durante la contabilidad, el G1 GC identifica regiones completamente libres y candidatos de recolección de basura mixta. La fase de limpieza es parcialmente concurrente cuando se restablece y devuelve las regiones vacías a la lista libre.

Valores predeterminados importantes

El G1 GC es un recolector de basura adaptable con valores predeterminados que le permiten funcionar de manera eficiente sin modificaciones. Aquí hay una lista de opciones importantes y sus valores predeterminados. Esta lista se aplica a la última máquina virtual Java HotSpot, compilación 24. Puede adaptar y ajustar el G1 GC a las necesidades de rendimiento de su aplicación ingresando las siguientes opciones con configuraciones cambiadas en la línea de comandos de JVM.

  • -XX:G1HeapRegionSize=n

    Establece el tamaño de una región G1. El valor será una potencia de dos y puede oscilar entre 1 MB y 32 MB. El objetivo es tener alrededor de 2048 regiones basadas en el tamaño mínimo de almacenamiento dinámico de Java.

  • -XX:MaxGCPauseMillis=200

    Establece un valor objetivo para el tiempo máximo de pausa deseado. El valor predeterminado es 200 milisegundos. El valor especificado no se adapta a su tamaño de pila.

  • -XX:G1NewSizePercent=5

    Establece el porcentaje del montón que se utilizará como mínimo para el tamaño de la generación joven. El valor predeterminado es el 5 por ciento de su montón de Java. Esta es una bandera experimental. Ver «Cómo desbloquear banderas de VM experimentales«por ejemplo. Esta configuración reemplaza la -XX:DefaultMinNewGenPercent configuración. Esta configuración no está disponible en Java HotSpot VM, compilación 23.

  • -XX:G1MaxNewSizePercent=60

    Establece el porcentaje del tamaño del montón que se utilizará como máximo para el tamaño de la generación joven. El valor predeterminado es el 60 por ciento de su montón de Java. Esta es una bandera experimental. Ver «Cómo desbloquear banderas de VM experimentales«por ejemplo. Esta configuración reemplaza la -XX:DefaultMaxNewGenPercent configuración. Esta configuración no está disponible en Java HotSpot VM, compilación 23.

  • -XX:ParallelGCThreads=n

    Establece el valor de los subprocesos de trabajo STW. Establece el valor de n en el número de procesadores lógicos. El valor de n es el mismo que el número de procesadores lógicos hasta un valor de 8.

    Si hay más de ocho procesadores lógicos, establece el valor de n a aproximadamente 5/8 de los procesadores lógicos. Esto funciona en la mayoría de los casos, excepto para sistemas SPARC más grandes donde el valor de n puede ser aproximadamente 5/16 de los procesadores lógicos.

  • -XX:ConcGCThreads=n

    Establece el número de hilos de marcado paralelos. Conjuntos n a aproximadamente 1/4 del número de subprocesos de recolección de basura paralelos (ParallelGCThreads).

  • -XX:InitiatingHeapOccupancyPercent=45

    Establece el umbral de ocupación del montón de Java que desencadena un ciclo de marcado. La ocupación predeterminada es el 45 por ciento de todo el montón de Java.

  • -XX:G1MixedGCLiveThresholdPercent=65

    Establece el umbral de ocupación para que una región antigua se incluya en un ciclo de recolección de basura mixta. La ocupación predeterminada es del 65 por ciento. Esta es una bandera experimental. Ver «Cómo desbloquear banderas de VM experimentales«por ejemplo. Esta configuración reemplaza la -XX:G1OldCSetRegionLiveThresholdPercent configuración. Esta configuración no está disponible en Java HotSpot VM, compilación 23.

  • -XX:G1HeapWastePercent=10

    Establece el porcentaje de montón que está dispuesto a desperdiciar. La máquina virtual Java HotSpot no inicia el ciclo de recolección de basura mixta cuando el porcentaje recuperable es menor que el porcentaje de desperdicio de pila. El valor predeterminado es el 10 por ciento. Esta configuración no está disponible en Java HotSpot VM, compilación 23.

  • -XX:G1MixedGCCountTarget=8

    Establece el número objetivo de recolecciones de basura mixtas después de un ciclo de marcado para recolectar regiones antiguas con como máximo G1MixedGCLIveThresholdPercent datos en tiempo real. El valor predeterminado es 8 recolecciones de basura mixtas. El objetivo de las colecciones mixtas es estar dentro de este número objetivo. Esta configuración no está disponible en Java HotSpot VM, compilación 23.

  • -XX:G1OldCSetRegionThresholdPercent=10

    Establece un límite superior en la cantidad de regiones antiguas que se recopilarán durante un ciclo de recolección de basura mixta. El valor predeterminado es el 10 por ciento del montón de Java. Esta configuración no está disponible en Java HotSpot VM, compilación 23.

  • -XX:G1ReservePercent=10

    Establece el porcentaje de memoria de reserva que se debe mantener libre para reducir el riesgo de desbordamientos de espacio. El valor predeterminado es el 10 por ciento. Cuando aumente o disminuya el porcentaje, asegúrese de ajustar el montón de Java total en la misma cantidad. Esta configuración no está disponible en Java HotSpot VM, compilación 23.

Cómo desbloquear banderas de máquinas virtuales experimentales

Para cambiar el valor de las banderas experimentales, primero debe desbloquearlas. Puede hacer esto configurando -XX:+UnlockExperimentalVMOptions explícitamente en la línea de comando antes de cualquier indicador experimental. Por ejemplo:

> java -XX:+UnlockExperimentalVMOptions -XX:G1NewSizePercent=10 -XX:G1MaxNewSizePercent=75 G1test.jar

Recomendaciones

Cuando evalúe y ajuste G1 GC, tenga en cuenta las siguientes recomendaciones:

  • Tamaño de generación joven: Evite establecer explícitamente el tamaño de la generación joven con el -Xmn opción o cualquier otra opción relacionada, como -XX:NewRatio. La fijación del tamaño de la generación joven anula el objetivo de tiempo de pausa objetivo.
  • Metas de tiempo de pausa: Cuando evalúa o ajusta cualquier recolección de basura, siempre existe una compensación entre latencia y rendimiento. El G1 GC es un recolector de basura incremental …

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

1AcZIzXFAJm ZafRKleF 0g

Inicialización de peso en redes neuronales: un viaje desde lo básico hasta Kaiming

Sentencia SQL SELECT INTO