Alguns coletores de lixo (pelo menos Mono e .NET) têm uma área de memória de curto prazo que eles varrem com freqüência e uma área de memória secundária que eles varrem com menos frequência. Mono chama isso de berçário.
Para descobrir quais objetos podem ser descartados, eles examinam todos os objetos a partir de raízes, a pilha e os registros e descartam todos os objetos que não estão mais sendo referenciados.
Minha pergunta é como eles impedem que toda a memória em uso seja varrida em cada coleta? Em princípio, a única maneira de descobrir quais objetos não estão mais em uso é verificar todos os objetos e todas as suas referências. No entanto, isso impediria que o sistema operacional trocasse memória, mesmo que não esteja sendo usado pelo aplicativo e pareça uma enorme quantidade de trabalho que precisa ser feito, também para "Coleção de berçário". Não parece que eles estão ganhando muito usando um berçário.
Estou faltando alguma coisa ou o coletor de lixo está realmente varrendo todos os objetos e todas as referências toda vez que faz uma coleta?