Algoritmo de coleta de lixo JVM de conhecimento básico de Java

Algoritmo de coleta de lixo

4 ideias principais de algoritmos de coleta de lixo

Contagem de referência
Copiar cópia
Remoção de
marcas Classificação de marcas

Um recurso importante da linguagem Java é que ela pode executar automaticamente o processamento de coleta de lixo, sem que os desenvolvedores prestem muita atenção à liberação dos recursos do sistema. Embora a coleta de lixo automática reduza muito a carga de trabalho dos desenvolvedores, ela também aumenta a carga sobre o sistema de software. Um método e uma estratégia de coleta de lixo inadequados afetarão adversamente o desempenho do sistema.

1. Contagem de referência

O método de contagem de referência é o método de coleta de lixo mais clássico e antigo, e sua implementação também é muito simples: para um objeto A, desde que qualquer objeto faça referência a A, o contador de A é aumentado em 1, e quando a referência for inválida, o contador de referência Diminuir 1. Enquanto o valor do contador de referência do objeto A for 0, o objeto A não pode mais ser usado.

O método de contagem de referência é simples de implementar e só precisa ser equipado com um contador inteiro para cada objeto. Porém, ele tem um problema sério, ou seja, não consegue lidar com referências circulares, então esse algoritmo não é usado no coletor de lixo do Java.

Um exemplo de referência circular simples é o seguinte:

Insira a descrição da imagem aqui

O objeto A e o objeto B são referenciados ciclicamente. Neste momento, seus contadores de referência não são 0, mas o terceiro objeto não pode ser encontrado no sistema que se refere a A ou B. Ou seja, A e B devem ser lixo reciclado . No entanto, ele não pode ser reconhecido por causa de referências circulares, que podem eventualmente levar a vazamentos de memória.

2. Método de marcação e varredura

O método mark-sweep é a base dos algoritmos modernos de coleta de lixo.

Ele divide a coleta de lixo em duas fases: fase de marcação e fase de limpeza. Uma possível implementação é:

  • Na fase de marcação, todos os objetos alcançáveis ​​a partir do nó raiz são marcados. Portanto, todos os objetos não marcados são objetos de lixo não referenciados.
  • Na fase de remoção, todos os objetos não marcados são removidos.

O maior problema que o método de marcação e varredura pode causar são os detritos espaciais. O espaço após a reciclagem não é contínuo e a eficiência de funcionamento do espaço de memória descontínua é menor do que a do espaço contínuo.Esta é a maior deficiência do método de marcação e varredura.

3. Copiar algoritmo

Comparado com o método mark-sweep, o algoritmo de cópia é um algoritmo de recuperação relativamente eficiente.

Sua ideia central é: dividir a memória em duas partes e usar apenas uma parte de cada vez. Durante a coleta de lixo, os objetos de inventário na memória em uso são copiados para o bloco de memória não usado e, em seguida, todos os objetos no bloco de memória em uso são apagados e as funções das duas memórias são trocadas para completar a coleta de lixo.

Se houver muitos objetos de lixo no sistema, o número de objetos ativos que o algoritmo de replicação precisa para replicar não será grande, portanto, é mais eficiente quando o algoritmo de replicação precisa ser usado. E como todos os objetos serão copiados uniformemente para o novo espaço de memória, pode-se garantir que o espaço de memória recuperado esteja livre de fragmentação.

Embora existam as duas vantagens acima, a desvantagem de custo do algoritmo de cópia é que a memória do sistema é reduzida à metade. Portanto, um algoritmo de cópia simples será inaceitável.

No coletor de lixo serial de nova geração do Java, um algoritmo de cópia é usado. A nova geração está dividida em três partes: espaço eden, do espaço e para o espaço. Os espaços de e para podem ser considerados dois blocos de espaço do mesmo tamanho, status igual e funções intercambiáveis ​​para cópia. Eles também são chamados de espaço do sobrevivente, ou seja, espaço do sobrevivente, usado para armazenar objetos não recuperados .

Durante a coleta de lixo, os objetos sobreviventes no espaço do éden serão copiados para o espaço do sobrevivente não utilizado (assumindo que), e os objetos jovens no espaço do sobrevivente (assumindo que sejam de) sendo usados ​​também serão copiados para o espaço ( Objetos grandes ou objetos idosos entrarão diretamente na velhice; se o espaço estiver cheio, os objetos também entrarão diretamente na velhice). Nesse momento, os objetos restantes no éden e dos espaços serão objetos de lixo e podem ser esvaziados diretamente, e o espaço para armazenar os objetos que sobreviveram à coleta.

Este algoritmo de cópia aprimorado não só garante a continuidade do espaço, mas também evita o desperdício de uma grande quantidade de espaço de memória.

4. Algoritmo de compressão de marca

A eficiência do algoritmo de replicação é baseada na premissa de que existem poucos objetos sobreviventes e muitos objetos de lixo. Esta situação é comum na geração jovem, mas na geração anterior é mais comum que a maioria dos objetos sejam objetos sobreviventes.Se o algoritmo de replicação for usado, o custo de replicação será alto devido ao grande número de objetos sobreviventes.

Com base nas características da coleta de lixo na velhice, novos algoritmos precisam ser usados, e o algoritmo de compressão de marca é um algoritmo de reciclagem da velhice, que fez algumas otimizações no algoritmo de varredura de marca.

Ele difere do algoritmo marcar e varrer porque compacta todos os objetos vivos para a outra extremidade da memória durante a fase de limpeza. Em seguida, limpe todo o espaço fora do limite. Este algoritmo não apenas evita a geração de fragmentos, mas também não requer duas partes do mesmo espaço de memória, por isso é econômico.

5. Algoritmo incremental

Para a maioria dos algoritmos de coleta de lixo, durante o processo de coleta de lixo, todos os encadeamentos do software aplicativo irão travar, suspender todo o trabalho normal e aguardar a conclusão da coleta. Se a coleta de lixo levar muito tempo, o aplicativo será suspenso por um longo tempo, o que afetará seriamente a experiência do usuário e a estabilidade do sistema.

A ideia básica do algoritmo incremental é permitir que os encadeamentos de coleta de lixo e os encadeamentos do aplicativo sejam executados alternadamente, coletando apenas uma pequena área de espaço de memória a cada vez e, em seguida, alternando os encadeamentos do aplicativo. Então, vá e volte até que a coleta de lixo seja concluída.

A coleta de lixo dessa forma pode reduzir o tempo de pausa do sistema, mas devido ao consumo de troca de encadeamento e troca de contexto, o custo geral da coleta de lixo aumentará, resultando em uma diminuição no rendimento do sistema.

6. Geração

Nenhum dos vários algoritmos de coleta de lixo apresentados acima pode substituir completamente outros algoritmos e eles têm suas próprias vantagens e desvantagens. Portanto, de acordo com as características dos objetos de coleta de lixo, é uma escolha sábia usar algoritmos apropriados para a coleta.

A geração da geração é baseada nesta ideia, que divide a área da memória em vários blocos de acordo com as características do objeto, de acordo com as características de cada bloco de memória, diferentes algoritmos de reciclagem são usados ​​para melhorar a eficiência da coleta de lixo.

imagem

Marcar

Insira a descrição da imagem aqui
Insira a descrição da imagem aqui

Marcar claro

Insira a descrição da imagem aqui
Insira a descrição da imagem aqui

Algoritmo de cópia

Insira a descrição da imagem aqui
Insira a descrição da imagem aqui

Algoritmo de coleta geracional

Para ser mais preciso, é diferente dos três algoritmos anteriores. O algoritmo de coleta geracional é baseado na idade do objeto, usando os três algoritmos acima para coletar.

  1. Para a nova geração: cada GC tem um grande número de objetos que morrem e poucos sobrevivem.O algoritmo de replicação é freqüentemente usado e apenas alguns objetos precisam ser copiados.
  2. Para a velhice: use frequentemente algoritmos de definição padrão ou inteiro padrão.

referência

"Compreensão aprofundada da máquina virtual Java: recursos avançados e práticas recomendadas de JVM" (segunda edição)
Diversas ideias de algoritmos de coleta de lixo sobre JVM
Seis principais algoritmos e ideias de coleta de lixo

Acho que você gosta

Origin blog.csdn.net/e891377/article/details/108776921
Recomendado
Clasificación