La guía definitiva para el rendimiento de Java - Resumen 9

algoritmo de recolección de basura

Descripción de los recopiladores de CMS

Ajuste de generación permanente para recopiladores CMS

A partir de los registros de recolección de basura de CMS, se encontró que si la generación permanente necesita ser recolectada como basura, ocurrirá FullGC (lo mismo sucederá si se necesita ajustar el tamaño del metaespacio). Esto sucede a menudo en servidores donde los programadores implementan (o vuelven a implementar) aplicaciones con frecuencia, o en aplicaciones donde las clases deben definirse (o reciclarse) con frecuencia.

De forma predeterminada, el subproceso de recolección de basura de CMS en Java 7 no procesará la basura en la generación permanente.Si se agota el espacio de generación permanente, CMS iniciará un GC completo para reciclar los objetos de basura en él. Además, también puede activar -XX:+CMSPermGenSweepingEnabledla bandera (por defecto, el valor de la bandera es falso).Después de que se activa, la basura en la generación permanente se recolecta de la misma manera que en la generación anterior: a través de un grupo de subprocesos de fondo para reciclar la generación permanente al mismo tiempo Objetos basura en la generación. Tenga en cuenta que los indicadores que activan la recolección de elementos no utilizados de generación permanente son independientes de los indicadores de la generación anterior. Utilice -XX:CMSInitiatingPermOccupancyFraction=Nparámetros para especificar que el recopilador de CMS inicie el subproceso de recolección de elementos no utilizados de generación permanente cuando la tasa de ocupación del espacio de generación permanente alcance el valor establecido. El valor predeterminado de este parámetro es 80 %.

Sin embargo, habilitar la recolección de elementos no utilizados de generación permanente es solo un paso en todo el proceso. Para poder liberar realmente las clases a las que ya no se hace referencia, es -XX:+CMSClassUnloadingEnablednecesario establecer un indicador. De lo contrario, incluso si la recolección de basura de generación permanente está habilitada, solo se puede liberar una pequeña cantidad de objetos no válidos y los metadatos de la clase no se liberarán. Dado que una gran cantidad de datos en la generación permanente son metadatos de clases, este indicador también debe habilitarse cuando se inicia la recolección de elementos no utilizados de generación permanente de CMS.

En Java8, el recopilador de CMS recopilará las clases que ya no se cargan en el metaespacio de forma predeterminada. Si por algún motivo desea desactivar esta función, puede -XX:-CMSClassUnloadingEnableddesactivarla con una bandera (de forma predeterminada, esta bandera está activada, es decir, el valor es verdadero).

Recolección incremental de elementos no utilizados de CMS

Para una recolección de elementos no utilizados de CMS eficiente, se consumen recursos de procesamiento de CPU adicionales. Si tiene una máquina de una sola CPU o varias CPU muy ocupadas, pero quiere usar un recolector de basura de baja latencia, ¿cuáles son algunas buenas sugerencias?

增量式CMS垃圾收集在Java8中已经不推荐使用
增量式CMS垃圾收集(iCMS)在Java8中已经不推荐使用了,不过暂时还保留在其中,但是在Java9中很可能会被移除。
使用增量式CMS垃圾收集的主要好处是后台线程会间歇性地停顿,让出一部分CPU给应用程序线程运行,从而使得CMS收集器即使在只配备了有限CPU资源的机器上也能运行。
随着多核技术的发展,多处理器几乎已经成为所有系统的标准配置(连我的手机都装载了4核的CPU芯片),这使得iCMS存在的意义变得不再那么重要。
如果系统确实只配备了极其有限的CPU,作为替代方案,可以考虑使用G1收集器——因为G1收集器的后台线程在垃圾收集的过程中也会周期性地暂停,
客观上减少了与应用线程竞争CPU资源的情况。

En estos casos, use el recolector de CMS para la recolección incremental de elementos no utilizados, es decir, siempre que haya subprocesos en segundo plano ejecutándose (la cantidad de subprocesos que se ejecutan al mismo tiempo no debe exceder uno ), el recolector de elementos no utilizados no desechará inmediatamente todo el montón. recolectar. Este subproceso en segundo plano se detiene de forma intermitente, lo que ayuda a mejorar el rendimiento general del sistema, ya que se otorgan más recursos de procesamiento de CPU al subproceso de la aplicación para que se ejecute. Por supuesto, una vez que se ejecuta el subproceso de recopilación de CMS, seguirá compitiendo con el subproceso de la aplicación por ciclos de procesamiento de CPU limitados.

Especifique -XX:+CMSIncrementalModeel indicador para habilitar la recolección de elementos no utilizados de CMS incremental. Al cambiar el indicador -XX:CMSIncrementalSafetyFactor=N, -XX:CMSIncrementalDutyCycleMin=Npuede -XX:CMSIncrementalPacingcontrolar cuántos ciclos de CPU cede el subproceso de fondo de recolección de elementos no utilizados para el subproceso de la aplicación.

La recolección incremental de elementos no utilizados de CMS funciona de acuerdo con el principio del ciclo de trabajo, que determina la frecuencia con la que el subproceso de fondo del recolector de elementos no utilizados de CMS analiza el montón antes de liberar ciclos de CPU a los subprocesos de la aplicación. Desde la perspectiva del sistema operativo, los subprocesos en segundo plano del recolector de elementos no utilizados del CMS han competido con los subprocesos de la aplicación (generalmente basados ​​en intervalos de tiempo). Desde otra perspectiva, estos indicadores en realidad controlan cuánto tiempo continúa ejecutándose el subproceso en segundo plano antes de pausar activamente y liberar recursos para que se ejecute el subproceso de la aplicación.

La duración del ciclo de responsabilidad se calcula a partir del tiempo transcurrido entre dos recolecciones de basura adyacentes en la generación joven; de forma predeterminada, la recolección de basura incremental de CMS dura aproximadamente el 20% de este tiempo (al menos inicialmente Este valor, pero el CMS continuará para ajustar este valor para dar cabida a la cantidad de objetos que se promocionan continuamente a la generación anterior). Si este tiempo no es lo suficientemente largo, se producirá la invalidación del modo concurrente (y el GC completo). El objetivo es evitar tales GC (o minimizar la frecuencia con la que ocurren) ajustando la recolección incremental de elementos no utilizados de CMS.

Puede comenzar ajustando el CMSIncrementalSafetyFactorparámetro de aumento, que es el porcentaje de tiempo para aumentar al ciclo de trabajo predeterminado. El valor predeterminado del ciclo de trabajo es del 10 % y, de forma predeterminada, el valor del factor de seguridad se incrementa en otro 10 % (de modo que el porcentaje predeterminado de tiempo que toma el ciclo de trabajo inicial se convierte en el 20 %). Al aumentar el factor de seguridad (se puede aumentar hasta 90, pero esto hará que el ciclo de incremento ocupe todo el tiempo), es posible dejar más tiempo para que se ejecute el subproceso en segundo plano.

Además, la duración del ciclo de trabajo también se puede ajustar si el parámetro CMSIncrementalDutyCycleMinse establece en un valor mayor que el valor predeterminado (10). Sin embargo, el valor de este parámetro se verá afectado por el mecanismo de ajuste automático de la JVM, porque el mecanismo de ajuste automático de la JVM controlará la cantidad de objetos promovidos de la nueva generación a la generación anterior y se ajustará en consecuencia. Por lo tanto, incluso si se aumenta este valor, la JVM aún puede reducir el valor de este parámetro en función de su propio criterio de que la operación de recolección de elementos no utilizados incremental no necesita ejecutarse con demasiada frecuencia. Si la operación tiene picos explosivos cuando la aplicación se está ejecutando, los resultados calculados por el mecanismo de ajuste automático generalmente son inexactos, y el período de responsabilidad debe establecerse explícitamente, y el ajuste automático de parámetros se apaga ajustando la bandera (el valor predeterminado es cierto, es decir, está encendido CNSIncrementalDutyCycle) CMSIncrementalDutyCycle.

sumario rápido

  1. El recopilador de CMS incremental es una buena opción cuando la aplicación se ejecuta en una máquina con recursos de CPU limitados y requiere pequeñas pausas.
  2. El recopilador de CMS incremental se puede ajustar a través del ciclo de trabajo; aumentar el tiempo de ejecución del ciclo de trabajo puede evitar fallas en el modo simultáneo del recopilador de CMS.

Supongo que te gusta

Origin blog.csdn.net/weixin_42583701/article/details/131118137
Recomendado
Clasificación