A alocação e liberação da memória em Java e C# são gerenciadas automaticamente por máquinas virtuais. Eu já introduzi o método de reciclagem de objetos GC no CLR, que é uma estratégia de reciclagem de memória baseada em geração. De fato, em Java, a estratégia de reciclagem de objetos da JVM também se baseia na idéia de divisão geracional. O objetivo disso é aumentar o lixo
O desempenho da reciclagem evita o atraso na resposta do programa causada pela verificação de todos os objetos na pilha, porque quando a JVM executa o GC, interrompe a palavra, ou seja, encerra a operação de outros threads e restaura apenas as operações de outros threads após a conclusão da reciclagem. A idéia baseada na divisão geracional é: a JVM precisa apenas de uma pequena parte da memória toda vez que ele executa o coletor de lixo.
As referências de objetos são verificadas e esse pequeno número de objetos tem um ciclo de vida mais curto, que acelera o desempenho da coleta de lixo. Abaixo, apresentaremos as estratégias básicas de algoritmos de recuperação de memória baseados em geração em Java no futuro:
1. Divisão de geração da memória da JVM Heap
Em uma estratégia de recuperação de memória baseada em geração, o espaço da pilha geralmente é dividido em três gerações, geração jovem, geração antiga (ou geração titular) e geração permanente. Entre a geração jovem, existem três pequenas áreas: Eden, S0 e S1, como mostrado na figura abaixo:
Entre eles, os novos objetos são sempre atribuídos à geração etária. Quando o espaço da geração jovem é preenchido, é necessário executar uma coleção de lixo, ou seja, o GC menor é executado, para reciclar os objetos que não são mais referenciados e, ao mesmo tempo, aumentam a idade dos objetos sobreviventes. Os objetos sobreviventes na geração etária têm um campo de identificação de idade. Quando atingirem um certo limiar, os objetos ainda sobreviventes serão promovidos ao espaço antigo da geração.
O espaço da geração antiga é usado para armazenar objetos que sobreviveram há muito tempo, ou seja, objetos com um ciclo de vida longo. Uma vez que os objetos sobreviventes no espaço jovem da geração atinjam um certo limite de idade, ele será promovido automaticamente para a geração antiga. Quando o espaço da geração antiga é preenchido com objetos, o GC principal será executado uma vez. Comparado ao GC menor, o número de execuções de GC principal é muito menor que o de GC menor. Ao mesmo tempo, o GC principal executa mais que o GC menor. Porque envolve mais varredura de objetos. Essa idéia geracional também se baseia na melhor escolha na prática que, na prática, os objetos recém -alocados têm um ciclo de vida mais curto e os objetos idosos têm um ciclo de vida mais longo.
Ao mesmo tempo, quando o GC menor e o maior GC realizam a coleta de lixo, eles fazem o evento Stop the World, ou seja, encerrar os threads em execução e restaurar todos os threads quando o GC é executado.
Para memória de geração permanente, ela é usada principalmente para armazenar informações relevantes de metadados, informações de classes e métodos. Quando uma classe não estiver mais em uso, ela será reciclada. Quando o GC completo é executado, a memória de geração permanente será digitalizada para coleta de lixo.
2. Processamento do processo de coleta de lixo baseado em geração
Primeiro, no início, o novo objeto é atribuído à área do Éden, S0 e S1 estão vazios. Quando o espaço no Éden for preenchido, faça um GC menor uma vez. O coletor de lixo moverá o objeto referenciado para a área S0, e os objetos que não são mais referenciados serão excluídos. Ao mesmo tempo, a idade do objeto sobrevivente é 1. Depois que o GC é identificado, as áreas do Éden e S1 estão vazias, como mostrado na figura abaixo.
Na próxima vez que o GC menor for executado, o mesmo que as etapas de execução anteriores, a única diferença é que o objeto referenciado, ou seja, o objeto sobrevivente, será movido para a área S1 e a idade do objeto que sobrevive na área S0 aumentará em 1 e se tornará 2, como mostrado na figura abaixo.
Quando o GC menor é executado novamente, o objeto sobrevivente será movido para a área S0 e adicionará 1 à idade do objeto sobrevivente, como mostrado na figura abaixo
Quando o GC menor é finalmente executado, verifica -se que o objeto sobrevivente no S1 atinge 8 (assumindo que o limite seja definido como 8) e o objeto será promovido à memória da velhice, como mostrado na figura abaixo.
Z
Quando o espaço antigo da pilha for preenchido com objetos, o GC principal será executado uma vez, o que limpará os objetos de que o heap antigo não é mais referenciado e, ao mesmo tempo, comprime o espaço. Como mostrado na figura abaixo.
A breve discussão acima sobre a estratégia de reciclagem 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.