2012-03-14 17 views
9

Estoy confundido acerca de dos parámetros que pueden controlar cuando las patadas del colector de CMS en:Recolector de basura CMS: ¿cuándo funciona?

MaxHeapFreeRatio (70% por defecto)

CMSInitiatingOccupancyFraction (más del 90% por defecto)

Lo que hace cada uno de los los parámetros significan, exactamente? ¿Cuándo comienza el colector (la fase de marcado) y recoge (la fase de barrido)?

Respuesta

11

CMSInitiatingOccupancyFraction decide cuando se inicia el CMS (para que esta opción sea efectiva, también debe establecer XX: + UseCMSInitiatingOccupancyOnly). MaxHeapFreeRatio es una opción para dimensionar los espacios generacionales.

Véase, por ejemplo ...

http://java.sun.com/docs/hotspot/gc1.4.2/faq.html

La colección concurrente en general, no se puede acelerar pero se puede iniciar antes. Una recopilación concurrente 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 recolector simultáneo. Si se están produciendo colecciones completas, es posible que las colecciones concurrentes deban comenzar antes. El indicador de línea de comando CMSInitiatingOccupancyFraction se puede usar para establecer el nivel en el que se inicia la colección. Su valor predeterminado es aproximadamente 68%. La línea de comandos para ajustar el valor es -XX: CMSInitiatingOccupancyFraction =

http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html

Por defecto, la máquina virtual crece o se reduce el montón en cada colección para tratar de mantener la proporción de espacio libre para vivir en objetos cada colección dentro de un rango específico. Este rango objetivo se establece como un porcentaje según los parámetros -XX: MinHeapFreeRatio = y -XX: MaxHeapFreeRatio =, y el tamaño total está limitado debajo de -Xms y más arriba por -Xmx. Los parámetros por defecto para el sistema operativo Solaris de 32 bits (Edición SPARC) se muestran en la siguiente tabla:

.. o ..

http://www.petefreitag.com/articles/gctuning/

-XX: MaxHeapFreeRatio - cuando el porcentaje de libres espacio en una generación excedió este valor la generación se reducirá para cumplir con este valor. El valor predeterminado es 70

EDITAR: Realicé algunas simulaciones con un programa de prueba que crea aleatoriamente mapas de matrices de bytes y los copia alrededor. Noté que a) no se respetó el valor de la fracción, en particular con un valor conservador (digamos 50), la etapa de marca inicial CMS dio mucho más del 50% de ocupación, típicamente alrededor del 70-80% yb) los valores de fracción más pequeños hicieron el CMS etapa inicial ocurra antes (programa utilizado -Xmx1536m -Xmx1536m -XX: NewSize = 512m -XX: + + gc UseConcMarkSweepGC la tala y los dos parámetros de prueba)

también he encontrado un viejo informe de error con respecto a esto: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6486089

+3

'CMSInitiatingOccupancyFraction' solo se usa para la primera colección a menos que' -XX: + UseCMSInitiatingOccupancyOnly' esté configurado. Si no configura el último conmutador, después del primero, las heurísticas habituales (que se basan en las estadísticas de asignación recopiladas durante el tiempo de ejecución) se utilizan para determinar cuándo se inicia el CMS. – Matt

+0

Gracias Matt, he agregado eso. – moodywoody

+0

Según algunas observaciones, parece que después de unas pocas horas de uso nocturno no se activó hasta que alcanzó más del 90% (es decir, "CMSInitiatingOccupancy". Sin embargo, durante el día no parece esperar tanto tiempo, pero se recoge antes). Esto parece corresponderse con lo que dijo @Matt, pero en este caso me gustaría saber qué son "las heurísticas habituales" y cuánto tiempo hace que el tiempo de paz se vuelva inactivo y esperar el umbral> 90%. –

Cuestiones relacionadas