2024-07-11
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
O coletor de lixo é a implementação específica do algoritmo de coleta de lixo . Como o coletor de lixo é dividido em geração jovem e geração antiga, além do G1 (que pode controlar tanto a geração nova quanto a geração antiga),Os coletores de lixo de nova e antiga geração devem ser utilizados em pares de acordo com as exigências do hotspot.(Você precisa escolher a combinação correspondente de acordo com a versão do JDK)
A relação de combinação específica é a seguinte:
No código-fonte subjacente da JVM, em alguns casos especiais, o reciclador CMS chamará o reciclador Serial Old.
Você não pode ver diretamente qual coletor de lixo é usado, só pode inferir com base no algoritmo.
Série é umColeção serial de thread único da geração jovemO coletor de lixo.
Excelente rendimento em um único processador CPU
A taxa de transferência em múltiplas CPUs não é tão boa quanto em outros coletores de lixo (thread único, usando apenas uma CPU. Se o heap for muito grande, o thread do usuário ficará esperando por um longo tempo).
Programas clientes escritos em Java ou cenários com configuração de hardware limitada (poucos núcleos de CPU)
-XX: UseSerialGC
: Tanto a nova geração quanto a antiga usam o coletor serial.
SerialOld é a versão da geração antiga do coletor de lixo Serial, usandoColeta serial de thread único
Excelente rendimento em um único processador CPU
A taxa de transferência em várias CPUs não é tão boa quanto em outros coletores de lixo. Se o heap for muito grande, o thread do usuário ficará esperando por um longo tempo.
Usado com o coletor de lixo serial ou em casos especiais do CMS
-XX: UseSerialGC
: Tanto a nova geração quanto a antiga usam o coletor serial.
O coletor de lixo ParNew é essencialmenteOtimização de serial em múltiplas CPUs, usando multi-threading para coleta de lixo
-XX: UseParNewGC
: A nova geração usa o coletor ParNew e a geração antiga usa o coletor serial.O coletor de lixo CMS concentra-se no tempo de pausa do sistema (para minimizar STW e otimizar a experiência do usuário),Permitir que threads de usuário e threads de coleta de lixo sejam executados simultaneamente em determinadas etapas, reduzindo o tempo de espera dos threads do usuário.
1. Problema de fragmentação de memória
2. Problema de degradação (em alguns casos específicos, degenerará em um coletor de thread único, como SerialOld)
3. Problema do lixo flutuante (algum lixo não pode ser reciclado durante o processo de reciclagem)
Cenários em sistemas de Internet de larga escala onde os usuários solicitam grandes quantidades de dados e alta frequência, como interfaces de pedidos, interfaces de produtos, etc.
XX: UseConcMarkSweepGC
, você pode definir os colecionadores da geração mais jovem e da geração mais velha, respectivamente.
Nota: STW só aparecerá durante as fases de marcação inicial e remarcação.
deficiência:
1. O CMS usa um algoritmo de marcação e limpeza Após a conclusão da coleta de lixo, um grande número de fragmentos de memória aparecerá para não afetar a alocação de objetos.O CMS será desfragmentado durante o Full GC. . Isso fará com que o thread do usuário seja pausado,Você pode usar o parâmetro -XX:CMSFullGCsBeforeCompaction=N (padrão 0) para ajustar o GC completo N vezes antes de classificá-lo.。
2. Incapaz de lidar com o "lixo flutuante" gerado durante o processo de limpeza simultânea e não pode obter a coleta de lixo completa (durante esse processo de limpeza, o thread do usuário criou alguns objetos simultaneamente, mas eles não foram usados novamente em breve. Esses objetos não são reciclado nesta limpeza e precisa esperar até a próxima limpeza, por isso é chamado de lixo flutuante).
3. Se não houver memória suficiente na geração antiga para alocar objetos, o CMS degenerará em Serial Old single-thread reciclando a geração antiga.
Número de threads simultâneos:
O número de threads ao executar a fase simultânea no CMS pode ser passado-XX:ConcGCThreads
Configuração de parâmetros, calculada pelo sistema, a fórmula de cálculo é(-XX:ParallelGCThreads定义的线程数 3) / 4
, ParallelGCThreads é o número de threads paralelos após a pausa do STW
ParallelGCThreads é determinado pelo número de núcleos do processador:
1. Quando o número de núcleos de CPU é menor que 8, ParallelGCThreads = Número de núcleos de CPU
2. Caso contrário, ParallelGCThreads = 8 (Número de núcleos de CPU – 8)*5/8
Existem 12 processadores lógicos no meu computador, então ParallelGCThreads = 8 (12 - 8) * 5/8 = 10, ConcGCThreads = (-XX: O número de threads definidos por ParallelGCThreads 3) / 4 = (10 3) / 4 = 3
Finalmente você pode obter esta foto:
As fases simultâneas de marcação e limpeza simultâneas serão processadas em paralelo usando três threads. A fase de remarcação será processada usando 10 threads. Como o número de núcleos da CPU é limitado, a fase simultânea afetará o desempenho da execução do thread do usuário.
Limpeza Paralela éColetor de lixo padrão da geração jovem JDK8, MultithreadingColeção paralela,Concentre-se no rendimento do sistema .Para aumentar o rendimento, o PS iráAjustar automaticamente o tamanho da memória heap (ajustar o tamanho da memória da nova geração, da antiga geração, limite de promoção)。
O Parallel Scavenge permite a configuração manual dos tempos máximos de pausa e da taxa de transferência. Os funcionários da Oracle recomendam não definir a memória heap máxima ao usar esta combinação. O coletor de lixo ajustará automaticamente o tamanho da memória com base no tempo máximo de pausa e na taxa de transferência.
-XX:MaxGCPauseMillis=n
Defina o máximo de milissegundos de pausa para cada coleta de lixo-XX:GCTimeRatio=n
Defina a taxa de transferência como n (tempo de execução do thread do usuário = n/(n 1))-XX: UseAdaptiveSizePolicy
A configuração permite que o coletor de lixo ajuste automaticamente o tamanho da memória com base na taxa de transferência e nos milissegundos máximos de pausa. Este parâmetro é habilitado por padrão (a Oracle recomenda que, ao usar a combinação PS, não defina o valor máximo da memória heap e deixe o coletor de lixo ajustar automaticamente. )Nota: Os dois indicadores de tempo máximo de pausa e taxa de transferência estão em conflito. O coletor de lixo fará o possível para atender ao tempo máximo de pausa (às vezes ele é definido como muito pequeno e não pode ser atendido, e o tempo máximo de pausa definido será excedido). , sacrificando a produtividade.Se você quiser definir o tempo máximo de pausa e a taxa de transferência ao mesmo tempo, precisará fazer mais testes para torná-los mais coordenados.
Parallel Old é uma versão de geração antiga projetada para o coletor Parallel Scavenge, utilizando coleção simultânea multithread.
JDK8 define parâmetros para usar este reciclador por padrão.
parâmetro:-XX: UseParallelGC
ou-XX: UseParallelOldGC
Você pode usar a combinação Parallel Scavenge Parallel Old.
-XX: PrintFlagsFinal
: Você pode imprimir os valores finais de todos os itens de configuração quando o programa for iniciado. Você pode verificar se a função de ajuste automático está ativada.
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* 垃圾回收器案例3
*/
//-XX: UseSerialGC -Xmn1g -Xmx16g -XX:SurvivorRatio=8 -XX: PrintGCDetails -verbose:gc -XX: PrintFlagsFinal
//-XX: UseParNewGC -Xmn1g -Xmx16g -XX:SurvivorRatio=8 -XX: PrintGCDetails -verbose:gc
//-XX: UseConcMarkSweepGC
//-XX: UseG1GC -Xmn8g -Xmx16g -XX:SurvivorRatio=8 -XX: PrintGCDetails -verbose:gc MaxGCPauseMillis
//-XX: PrintFlagsFinal -XX:GCTimeRatio = 19 -XX:MaxGCPauseMillis=10 -XX: UseAdaptiveSizePolicy
public class GcDemo2 {
public static void main(String[] args) throws IOException {
int count = 0;
List