Existem quatro algoritmos comuns de coleta de lixo na JVM:
Algoritmo de limpeza de marcas (mark-sweep);
Algoritmo de cópia (copiando);
Marca-compacto;
Coleção geracional;
Vamos apresentá -lo um a um:
1. Algoritmo de limpeza de marcas (sweep mark)
Este é o algoritmo de coleta de lixo mais básico. O algoritmo é dividido em dois estágios: "marcação" e "compensação": primeiro, todos os objetos que precisam ser reciclados são marcados e todos os objetos marcados são uniformemente reciclados após a conclusão da marcação. Suas principais desvantagens são duas: uma é o problema da eficiência, e a eficiência da marcação e limpeza não é alta; O outro é o problema do espaço, após a marcação é limpa, será gerado um grande número de fragmentos de memória descontínua. Muitos fragmentos espaciais podem causar um grande espaço contínuo insuficiente ao alocar objetos grandes, e outra ação de coleta de lixo deve ser acionada com antecedência.
Diagrama de algoritmo com mark-clear
2. Cópia do algoritmo (copiando)
Para resolver o problema de eficiência, com o algoritmo "cópia", ele divide a memória disponível em dois blocos do mesmo tamanho. Use apenas uma peça de cada vez. Quando uma parte do espaço for usada, copie o objeto ainda sobrevivente para outra peça e limpe o espaço de memória recém-usado de uma só vez. Isso possibilita reciclar uma das peças todas as vezes, para que a fragmentação da memória e outras situações complexas não sejam necessárias para serem consideradas ao alocar memória. Implementação simples e operação eficiente. Mas o custo desse algoritmo é reduzir a memória para metade do original, o que é um pouco caro demais. De fato, 98% dos objetos da nova geração ao vivo e morrem, portanto, não há necessidade de dividir a memória em uma proporção de 1: 1, mas dividir a memória em um espaço maior e dois espaços de sobreviventes menores, sempre usando o espaço do Éden e um dos espaços sobreviventes. Quando reciclado, copie os objetos ainda sobreviventes no Éden e Survivor para outro Suivivor ao mesmo tempo e, finalmente, limpe o espaço do Éden e o recém-utilizado sobrevivente.
Copiar diagrama de algoritmo
3. Mark-Compact
Quando a taxa de sobrevivência do objeto é alta, o algoritmo de replicação e coleta deve executar mais operações de replicação e a eficiência será menor. Mais importante, se você não deseja desperdiçar 50% do espaço, precisa ter espaço adicional para alocar garantias para lidar com a situação extrema em que todos os objetos na memória de meia zona estão 100% vivos, portanto esse algoritmo não pode ser usado diretamente em idosos.
Portanto, as pessoas propuseram outro algoritmo de "compacto de marca". Como objetos em idosos têm um longo ciclo de sobrevivência, algumas pessoas propuseram o algoritmo "Mark-Compact". O processo de marcação é o mesmo que "limpeza de marcas", mas enquanto limpam objetos mortos, os objetos sobreviventes serão classificados, o que pode reduzir o espaço fragmentado.
Diagrama do algoritmo de organização de marcas
4. Coleção geracional
Atualmente, a coleta de lixo para máquinas virtuais comerciais adota o algoritmo de "coleção geracional". Não há uma nova idéia neste algoritmo, mas a memória é dividida em várias partes de acordo com os diferentes ciclos de sobrevivência do objeto. Geralmente, os montes Java são divididos na nova geração e na geração antiga, para que o algoritmo de coleta mais apropriado possa ser usado de acordo com as características de cada geração. Na nova geração, toda vez que uma coleção de lixo é coletada, um grande número de objetos é encontrado morto e apenas um pequeno número sobrevive. Em seguida, use o algoritmo de cópia e a coleção pode ser concluída com uma pequena quantidade de custo de cópia. Nos idosos, como a taxa de sobrevivência dos objetos é alta e o ciclo é longo, o algoritmo "mark-tidy" ou "mark-clear" é usado para reciclá-lo.
A introdução acima aos algoritmos comuns de coleta de lixo na JVM é todo o conteúdo que compartilho com você. Espero que você possa lhe dar uma referência e espero que você possa apoiar mais o wulin.com.