Coletor de lixo CMS - quando ele é executado?
-
13-12-2019 - |
Pergunta
Estou confuso sobre dois parâmetros que podem controlar quando o coletor CMS entra em ação:
MaxHeapFreeRatio
(70% por padrão)
CMSInitiatingOccupancyFraction
(mais de 90% por padrão)
O que cada um desses parâmetros significa exatamente?Quando o coletor inicia (fase de marcação) e coleta (fase de varredura)?
Solução
CMSInitiatingOccupancyFraction
decide quando o CMS entra em ação (para que esta opção seja eficaz, você também deve definir -XX:+UseCMSInitiatingOccupancyOnly
). MaxHeapFreeRatio
é uma opção para dimensionar os espaços geracionais.
Veja por exemplo ...
http://java.sun.com/docs/hotspot/gc1.4.2/faq.html
A coleta simultânea geralmente não pode ser acelerada, mas pode ser iniciada mais cedo.Uma coleção simultânea começa a ser executada quando a porcentagem de espaço alocado na geração antiga ultrapassa um limite.Este limite é calculado com base na experiência geral com o coletor simultâneo.Se estiverem ocorrendo coletas completas, as coletas simultâneas talvez precisem ser iniciadas mais cedo.O sinalizador de linha de comando CMSInitiatingOccupancyFraction pode ser usado para definir o nível no qual a coleção é iniciada.Seu valor padrão é de aproximadamente 68%.A linha de comando para ajustar o valor é
-XX:CMSInitiatingOccupancyFraction=<percent>
http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html
Por padrão, a máquina virtual aumenta ou diminui o heap em cada coleção para tentar manter a proporção de espaço livre para objetos vivos em cada coleção dentro de um intervalo específico.Este intervalo alvo é definido como uma porcentagem pelos parâmetros
-XX:MinHeapFreeRatio=<minimum>
e-XX:MaxHeapFreeRatio=<maximum>
, e o tamanho total é limitado abaixo por-Xms
e acima por-Xmx
.
..ou ..
http://www.petefreitag.com/articles/gctuning/
-XX:MaxHeapFreeRatio
- quando a percentagem de espaço livre numa geração exceder este valor, a geração diminuirá para atingir este valor.O padrão é 70
EDITAR:Executei algumas simulações com um programa de teste que cria aleatoriamente mapas de matrizes de bytes e os copia.Percebi que a) o valor da fração não era respeitado - em particular com um valor conservador (digamos 50), o estágio inicial da marca CMS chutou muito além da ocupação de 50%, normalmente em torno de 70-80% e B), no entanto, valores de fração menores fizeram com que o CMS estágio inicial acontece mais cedo (programa usado -Xmx1536m -Xmx1536m -XX:NewSize=512m -XX:+UseConcMarkSweepGc
+ registro gc e os dois parâmetros de teste)
Também encontrei um relatório de bug antigo sobre isso: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6486089