Coletor de lixo comum

Coletor de lixo comum

Como mostrado abaixo:

 

1 coletor de lixo de nova geração

  1.1 Algoritmo de replicação de coletor serial 

Serial é um coletor de thread único para a nova geração, que usa um algoritmo de replicação para coleta de lixo. A coleta de lixo serial não usa apenas um encadeamento para realizar a coleta de lixo, ela também coleta, todos os encadeamentos do usuário devem ser suspensos (Stop The World).

A seguir está um diagrama esquemático da combinação do coletor Serial e do coletor Serial Old para a coleta de lixo. Quando os threads do usuário são executados em um ponto seguro, todos os threads suspendem a execução. O coletor Serial usa um único thread e um algoritmo de replicação para a coleta de lixo. Após a conclusão da coleta, o thread do usuário continua a ser executado.

Cenário aplicável: servidor de núcleo único.

Você pode usar -XX: + UserSerialGC para selecionar Serial como o coletor de nova geração.

1.2 Algoritmo de replicação do coletor de Scavenge Paralelo 

O coletor Parallel Scavenge é um coletor paralelo de nova geração que busca alto rendimento e uso eficiente da CPU.

O objetivo do coletor é atingir uma taxa de transferência controlável (Taxa de transferência). A chamada taxa de transferência é a razão entre o tempo usado pela CPU para executar o código do usuário e o tempo total consumido pela CPU, ou seja, taxa de transferência = tempo para executar o código do usuário / (tempo para executar o código do usuário + tempo de coleta de lixo)

Quanto menor o tempo de pausa, mais adequado é o programa que precisa interagir com o usuário. Uma boa velocidade de resposta pode melhorar a experiência do usuário, enquanto um alto rendimento pode usar o tempo de CPU de forma eficiente para concluir as tarefas de computação do programa o mais rápido possível. é adequado principalmente para computação em segundo plano. Tarefas que exigem muita interação.

Você pode usar -XX: MaxGCPauseMillis para definir por quanto tempo o coletor pode completar a recuperação de memória tanto quanto possível, e você pode usar -XX: GCTimeRatio para controlar com precisão a taxa de transferência.

 

 Cenários aplicáveis: preste atenção ao rendimento, use a CPU com eficiência, exija cálculos eficientes e não exija muita interação.

  Você pode usar -XX: + UseParallelGC para selecionar Parallel Scavenge como o coletor de nova geração, jdk7, jdk8 usar Parallel Scavenge como o coletor de nova geração por padrão.

1.3 Algoritmo ParNew Collector-Copy

O coletor ParNew é um coletor paralelo de nova geração, que na verdade é uma versão multiencadeada do coletor Serial.

ParNew não alcança resultados melhores do que o coletor Serial em um ambiente de CPU de núcleo único. O número de threads de coleta que ele abre por padrão é o mesmo que o número de CPUs. Você pode definir o número de threads de coleta de lixo por meio de -XX: ParallelGCThreads .

Cenário aplicável: servidor multi-core; usado com o coletor CMS. Ao usar -XX: + UserConcMarkSweepGC para selecionar CMS como o coletor de geração anterior, o coletor de nova geração é padronizado para ParNew, ou você pode usar -XX: + UseParNewGC para especificar o uso de ParNew como o coletor de nova geração.

2 Coletor de lixo para idosos

2.1 Coletor serial antigo

O coletor Serial Old é a versão antiga do Serial. Também é um coletor de thread único, usando um algoritmo de marcação e classificação.

2.2 Coletor antigo paralelo

O coletor Parallel Old é a versão antiga do Parallel Scavenge. É um coletor multithread com um algoritmo de marcação e classificação. Ele pode ser combinado com o coletor Parallel Scavenge para fazer uso total do poder de computação da CPU multi-core.

Use com o coletor Parallel Scavenge; concentre-se no rendimento. jdk7 e jdk8 usam este coletor como o coletor de geração anterior por padrão e usam -XX: + UseParallelOldGC para especificar o uso do coletor Paralle Old.

2.3 Coletor CMS (Varredura de Marca Simultânea)

O coletor CMS é um coletor que visa o tempo de pausa de recuperação mais curto e é conhecido como o "tempo de pausa de thread de usuário mais curto". Todo o processo de coleta de lixo é dividido em 4 etapas:

① Marca inicial: marque os objetos aos quais o GC Roots pode se associar diretamente, o que é mais rápido.

② Marcação simultânea: Rastreamento de raízes do GC é executado para marcar todos os objetos de lixo, o que leva muito tempo.

③ Remarcação: Leva pouco tempo para corrigir o registro de marcação do objeto alterado devido à operação contínua do programa do usuário durante a fase de marcação simultânea.

④ Remoção simultânea: Use o algoritmo de varredura de marcação para remover objetos de lixo, o que leva muito tempo.

A marcação e a remoção simultâneas mais longas de todo o processo funcionam junto com o thread do usuário, portanto, em geral, a coleta de lixo do coletor CMS pode ser considerada como sendo executada simultaneamente com o thread do usuário.

 

O coletor CMS também tem algumas desvantagens:

Incapaz de lidar com o lixo flutuante: na fase de limpeza simultânea, como o thread do usuário ainda está em execução, o novo lixo continuará a ser gerado e o coletor CMS não pode remover essa parte do lixo da coleção atual. Ao mesmo tempo, como os threads do usuário também estão executando simultaneamente na fase de coleta de lixo, o coletor CMS não pode esperar que a geração anterior seja preenchida como outros coletores antes de coletar. Ele precisa reservar uma parte do espaço para os threads do usuário executarem . Quando o CMS está em execução, o espaço de memória reservado não pode atender às necessidades dos threads do usuário e ocorrerá um erro de "Falha no modo simultâneo". Nesse momento, o plano de backup será ativado e o Serial Antigo será temporariamente usado para restaurar realizar a coleta de lixo da velha geração.

Como o CMS é baseado no algoritmo de varredura de marcação, a fragmentação do espaço será gerada após a coleta de lixo. Você pode ativar a desfragmentação por meio de -XX: UserCMSCompactAtFullCollection (ativado por padrão). Antes que o CMS execute Full GC, a desfragmentação da memória será realizada. Você também pode usar -XX: CMSFullGCsBeforeCompaction para definir quantos GCs completos sem compactação (sem desfragmentação) são executados, seguido por um GC Completo com compactação (desfragmentação).

Cenários aplicáveis: preste atenção à velocidade de resposta do servidor e exija o menor tempo de pausa do sistema. Você pode usar -XX: + UserConMarkSweepGC para selecionar CMS como o coletor de geração anterior.

Finalmente, adicione:

A relação entre o coletor de lixo e o tamanho da memória

    1. Serial 几十兆
    2. PS 上百兆 - 几个G
    3. CMS - 20G
    4. G1 - 上百G
    5. ZGC - 4T - 16T(JDK13)

1.8 O coletor de lixo padrão 

UseParallelGC significa Parallel Scavenge + Parallel Old, então verifique os detalhes

Configurações de parâmetro de combinação de coletor de lixo comum: (1.8)


* -XX: + UseSerialGC = Serial Novo (DefNew) + Serial Antigo
  * Programa pequeno. Esta opção não é usada por padrão, o HotSpot selecionará automaticamente o coletor com base no cálculo e configuração e versão JDK
* -XX: + UseParNewGC = ParNew + SerialOld
  * Esta combinação raramente é usada (foi descontinuada em algumas versões)
* -XX : + UseConc (urrent) MarkSweepGC = ParNew + CMS + Serial Old
* -XX: + UseParallelGC = Parallel Scavenge + Parallel Old (1.8 padrão) [PS + SerialOld]
* -XX: + UseParallelOldGC = Parallel Scavenge + Parallel Old
* -XX : + UseG1GC = G1
* O método de visualização GC padrão não é encontrado no Linux, e UseParallelGC
  * java + XX: + PrintCommandLineFlags -version será impresso no Windows 

O coletor G1 é diferente dos coletores de lixo acima, e o coletor G1 será escrito posteriormente.

Acho que você gosta

Origin blog.csdn.net/huzhiliayanghao/article/details/106909201
Recomendado
Clasificación