Recolector de basura CMS: ¿cuándo se ejecuta?
-
13-12-2019 - |
Pregunta
Estoy confundido acerca de dos parámetros que pueden controlar cuándo se activa el recopilador de CMS:
MaxHeapFreeRatio
(70% por defecto)
CMSInitiatingOccupancyFraction
(más del 90% por defecto)
¿Qué significa exactamente cada uno de esos parámetros?¿Cuándo comienza el recolector (la fase de marcado) y la recolección (la fase de barrido)?
Solución
CMSInitiatingOccupancyFraction
decide cuándo se activa el CMS (para que esta opción sea efectiva también debes configurar -XX:+UseCMSInitiatingOccupancyOnly
). MaxHeapFreeRatio
es una opción para dimensionar los espacios generacionales.
Ver por ejemplo...
http://java.sun.com/docs/hotspot/gc1.4.2/faq.html
La recopilación simultánea generalmente no se puede acelerar, pero se puede iniciar antes.Una colección simultánea comienza a ejecutarse cuando el porcentaje de espacio asignado en la generación anterior cruza un umbral.Este umbral se calcula en función de la experiencia general con el recopilador concurrente.Si se están produciendo recopilaciones completas, es posible que sea necesario iniciar las recopilaciones simultáneas antes.El indicador de línea de comando CMSInitiatingOccupancyFraction se puede utilizar para establecer el nivel en el que se inicia la colección.Su valor predeterminado es aproximadamente 68%.La línea de comando para ajustar el valor es
-XX:CMSInitiatingOccupancyFraction=<percent>
http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html
De forma predeterminada, la máquina virtual aumenta o reduce el montón en cada colección para intentar mantener la proporción de espacio libre para los objetos vivos en cada colección dentro de un rango específico.Este rango objetivo se establece como porcentaje mediante los parámetros
-XX:MinHeapFreeRatio=<minimum>
y-XX:MaxHeapFreeRatio=<maximum>
, y el tamaño total está limitado a continuación por-Xms
y arriba por-Xmx
.
..o ..
http://www.petefreitag.com/articles/gctuning/
-XX:MaxHeapFreeRatio
- cuando el porcentaje de espacio libre en una generación supere este valor, la generación se reducirá para alcanzar este valor.El valor predeterminado es 70
EDITAR :Ejecuté algunas simulaciones con un programa de prueba que crea aleatoriamente mapas de matrices de bytes y los copia.Noté que a) no se respetaba el valor de la fracción, en particular con un valor conservador (digamos 50), la etapa de la marca inicial de CMS empató mucho más de un 50% de ocupación, típicamente alrededor del 70-80% yb), sin embargo, los valores de fracción más pequeños hicieron que los CMS CMS hicieron que el CMS fuera el CMS. La etapa inicial ocurre anteriormente (programa utilizado -Xmx1536m -Xmx1536m -XX:NewSize=512m -XX:+UseConcMarkSweepGc
+ registro de gc y los dos parámetros de prueba)
También encontré un informe de error antiguo sobre esto: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6486089