(Para Go 1.8 - T1 2017, veja abaixo )
O próximo Go 1.5 Garbage Collector simultâneo do envolve a capacidade de "acompanhar" o gc.
Aqui está uma proposta apresentada neste artigo que pode servir para Go 1.5, mas também ajuda a entender o gc em Go.
Você pode ver o estado antes de 1.5 (Stop The World: STW)
Antes do Go 1.5, Go usava um coletor stop-the-world (STW) paralelo .
Embora a coleção STW tenha muitas desvantagens, ela pelo menos tem um comportamento de crescimento de heap previsível e controlável.
(Foto da apresentação GopherCon 2015 " Go GC: Resolvendo o problema de latência no Go 1.5 ")
O único botão de ajuste para o coletor STW era “GOGC”, o crescimento de heap relativo entre as coleções. A configuração padrão, 100%, acionou a coleta de lixo sempre que o tamanho do heap dobrou em relação ao tamanho do heap ativo da coleta anterior:
Cronometragem do GC no coletor STW.
Go 1.5 apresenta um coletor simultâneo .
Isso tem muitas vantagens sobre a coleta STW, mas torna o crescimento do heap mais difícil de controlar porque o aplicativo pode alocar memória enquanto o coletor de lixo está em execução .
(Foto da apresentação do GopherCon 2015 " Go GC: Resolvendo o problema de latência no Go 1.5 ")
Para atingir o mesmo limite de crescimento de heap, o tempo de execução deve iniciar a coleta de lixo mais cedo, mas o quanto antes depende de muitas variáveis, muitas das quais não podem ser previstas.
- Inicie o coletor muito cedo e o aplicativo executará muitas coletas de lixo, desperdiçando recursos da CPU.
- Inicie o coletor tarde demais e o aplicativo excederá o crescimento máximo de heap desejado.
Alcançar o equilíbrio certo sem sacrificar a simultaneidade requer um ritmo cuidadoso do coletor de lixo.
O ritmo de GC visa otimizar ao longo de duas dimensões: crescimento de heap e CPU utilizada pelo coletor de lixo.
O design do ritmo GC consiste em quatro componentes:
- um estimador para a quantidade de trabalho de digitalização que um ciclo de GC exigirá,
- um mecanismo para que modificadores executem a quantidade estimada de trabalho de varredura até que a alocação de heap atinja a meta de heap,
- um programador para verificação em segundo plano quando o modificador ajuda a subutilizar o orçamento da CPU, e
- um controlador proporcional para o gatilho GC.
O design equilibra duas visões diferentes de tempo: tempo de CPU e tempo de heap .
- O tempo da CPU é como o tempo padrão do relógio de parede, mas passa
GOMAXPROCS
mais rápido.
Ou seja, se GOMAXPROCS
for 8, então oito segundos de CPU passam a cada segundo de parede e o GC obtém dois segundos de tempo de CPU a cada segundo de parede.
O agendador de CPU gerencia o tempo de CPU.
- A passagem do tempo de heap é medida em bytes e avança conforme os modificadores alocam.
A relação entre o tempo de heap e o tempo de parede depende da taxa de alocação e pode mudar constantemente.
O Mutator auxilia no gerenciamento da passagem do tempo de heap, garantindo que o trabalho de varredura estimado tenha sido concluído no momento em que o heap atinge o tamanho desejado.
Por fim, o controlador de gatilho cria um loop de feedback que une essas duas visões de tempo, otimizando os objetivos de tempo de heap e de CPU.