O que é um coletor de lixo Java
O coletor de lixo Java é um dos três módulos importantes da máquina virtual de Java (JVM) (os outros dois são intérpretes e mecanismos multithread). Ele fornece aplicativos com alocação automática de memória (alocação de memória) e funções automáticas de coleta de memória (coleta de lixo). Ambas as operações ocorrem na pilha Java (um pedaço de memória é rápido). Em um certo momento, se um objeto tiver mais de uma referência apontando para ele, o objeto estará vivo. Caso contrário, será considerado lixo e poderá ser reciclado e reutilizado pelo coletor de lixo. As operações de coleta de lixo exigem CPU, tópicos, tempo e outros recursos, por isso é fácil entender que as operações de coleta de lixo não ocorrem em tempo real (o objeto é liberado imediatamente após a morte). Quando a memória é consumida ou um determinado indicador é atingido (limite, a razão entre a memória para a memória total é usada, como 0,75), a operação de coleta de lixo é acionada. Há uma exceção à morte de um objeto. Mesmo que um objeto do tipo java.lang.thread não seja referenciado, desde que o thread ainda esteja em execução, ele não será reciclado.
Mecanismo de reciclagem
De acordo com a análise estatística, a maioria dos objetos em Java (incluindo alguns outros idiomas de alto nível) tem ciclos de vida curtos, portanto a memória Java é gerenciada em gerações. O objetivo da divisão geracional nada mais é do que usar estratégias de gerenciamento diferentes (algoritmos) para blocos de memória de diferentes gerações para maximizar o desempenho. Comparado com a geração mais antiga, a geração mais jovem é geralmente muito menor e a frequência de reciclagem é alta e a velocidade é rápida. Os idosos têm baixa frequência de reciclagem e levam muito tempo. A memória é distribuída na geração jovem. Os objetos na geração jovem serão promovidos automaticamente para a antiga geração após vários ciclos de reciclagem.
Escolhas de design
A seleção do design afeta a dificuldade de implementação dos indicadores de coletor de lixo da JVM e da JVM e é adequada para diferentes cenários. Ele descreve as características de estilo do algoritmo de reciclagem.
Reciclagem serial de thread única versus reciclagem paralela com vários threads
A questão de saber se a operação de reciclagem em si é processada por vários threads. As vantagens da reciclagem de thread único são que é simples, fácil de implementar, com poucos fragmentos e é adequada para máquinas de núcleo único. A reciclagem paralela com vários tacos pode utilizar totalmente os recursos da CPU em máquinas de vários núcleos, reduzir o tempo de reciclagem e aumentar a produtividade. A desvantagem é que é complexa e alguns fragmentos podem não ser reciclados.
Pausa do tópico do aplicativo durante a reciclagem vs. concorrente de reciclagem e aplicação
Emita se deve pausar o encadeamento do aplicativo durante a operação de reciclagem. As vantagens de pausar threads de aplicativos são que são simples, precisas, limpas relativamente limpas e limpas por um curto período de tempo (excluindo os recursos da CPU). A desvantagem é que a pausa dos threads de aplicativos fará com que o tempo de resposta do aplicativo seja estendido durante o ciclo de coleta de lixo, e os sistemas com desempenho muito alto em tempo real são mais sensíveis. As vantagens do processamento paralelo dos threads de reciclagem e aplicação são que o tempo de reação do aplicativo é relativamente estável e as desvantagens são que é difícil de alcançar, alta frequência de limpeza e possível fragmentação.
Fragmentos de memória libertados unmirge vs mesclar fragmentos de memória libertada versus copiar o vivo para um novo lugar
Essas três opções descrevem como gerenciar fragmentos de blocos de memória morta. Os fragmentos de memória morta geralmente são espalhados por toda parte na pilha. Se eles não forem gerenciados, haverá dois problemas. Quando a alocação de memória é lenta devido à descoberta da memória disponível, pequenos fragmentos levarão ao desperdício de memória (como matrizes grandes requerem grandes fragmentos de memória contínua). Existem duas maneiras de gerenciar: mova a memória viva para uma extremidade do bloco de memória, registre a posição inicial da memória disponível ou simplesmente copie a memória viva para uma nova área de memória e o bloco de memória original está completamente vazio.
Métricas de desempenho
①. Produtividade (taxa de transferência)
A proporção de tempo de não recuperação e tempo total dentro de um período mais longo (apenas longos períodos são significativos). Medindo a eficiência operacional do sistema.
②. Coleta de lixo Sobrecarga
A proporção entre o tempo de recuperação para o tempo total por um período mais longo. Correspondendo à produtividade, a soma totaliza 100%.
③. Pausa tempo
Quando as máquinas virtuais Java reciclar lixo, alguns algoritmos pausam a execução de todos os threads de aplicativos, e alguns sistemas podem ser sensíveis ao intervalo de tempo de pausa.
④. Frequência de coleta
Quanto tempo leva para se recuperar?
⑤. O tamanho do uso da memória (pegada)
Como o tamanho da pilha.
⑥. Em tempo real (prontidão)
Quanto tempo leva para um objeto ocupar a memória do objeto a ser reciclado?
Tipos de coleta de lixo
Todos os tipos de recicladores são baseados em tecnologia geracional. A máquina virtual do Java Hotspot inclui três gerações, a geração jovem, a geração antiga e a geração permanente.
① Geração permanente
Armazena aulas, métodos e suas informações de descrição. O tamanho inicial e o valor máximo podem ser especificados pelas duas opções opcionais -xx: PermSize = 64m e -xx: maxpermsize = 128m. Normalmente, não precisamos ajustar esse parâmetro, o tamanho da geração permanente padrão é suficiente, mas se houver muitas classes carregadas e não o suficiente, basta ajustar o valor máximo.
② Geração mais antiga
Os principais objetos de armazenamento na geração jovem que ainda sobrevivem e atualizam após vários ciclos de reciclagem ainda estão vivos. Obviamente, para algumas grandes alocações de memória, elas também podem ser alocadas diretamente para a geração permanente (um exemplo extremo é que a geração jovem não pode salvar).
③Young Generation
A maioria das ações de alocação e reciclagem de memória ocorre nas gerações mais jovens. Como mostrado na figura abaixo, a geração jovem é dividida em três áreas, a área original (Éden) e duas pequenas áreas de sobrevivência (sobreviventes). As duas áreas de sobrevivência são divididas de e de acordo com suas funções. A maioria dos objetos é alocada na área original e mais de uma operação de coleta de lixo ainda sobrevive são colocadas na área de estar.
Colecionador em série
Um único thread executa uma operação de reciclagem, suspende a execução de todos os threads de aplicativos durante o período de reciclagem. O reciclador padrão no modo cliente é forçado a ser especificado através da opção de linha de comando -xx:+useSerialGC.
① Coleção minúscula para gerações jovens
Mova os objetos sobreviventes na área do Éden para a área. Se a área para não puder ser instalada, mova -se diretamente para a geração antiga. Se a área da área não puder ser instalada, mova -se diretamente para a geração antiga. Se a área da área for muito antiga, atualize para a antiga geração. Após a conclusão da reciclagem, o Éden e as áreas estão vazios. Neste momento, as funções de e para ser trocadas são trocadas para e para, e para estar vazio antes de cada rodada de reciclagem. A seleção do design é replicação.
②O algoritmo de reciclagem para idosos (coleção completa)
A reciclagem dos idosos é dividida em três etapas: marca, varredura e mesclagem. O estágio de marcação marca todos os objetos sobreviventes, o estágio de compensação libera todos os objetos mortos e o estágio de fusão mescla todos os objetos sobreviventes na parte anterior da antiga geração, deixando todos os fragmentos livres para trás. A seleção do design é fundir para reduzir a fragmentação da memória.
Colecionador paralelo
Use vários threads para executar a coleta de lixo ao mesmo tempo. O ambiente de vários núcleos pode utilizar completamente os recursos da CPU, reduzir o tempo de reciclagem, aumentar a produtividade da JVM e o reciclador padrão no modo de servidor. Como o reciclador em série, a execução de todos os threads de aplicativos é suspensa durante a reciclagem. Forçado a especificar através da opção de linha de comando -xx:+useParallelGC.
① Coleção minúscula para gerações jovens
Vários roscas são usadas para reciclar lixo e o algoritmo de cada rosca é o mesmo que o de um reciclador em série.
②O algoritmo de reciclagem para idosos (coleção completa)
A geração mais antiga ainda é um único thread, o mesmo que o reciclador em série.
Coleção de compactação paralela
A reciclagem da geração mais jovem e a geração mais antiga é processada por multi-threading. Especificado pela opção de comando -xx:+useParalleloldGC, xx: parallelgcthreads = 3 pode especificar ainda mais o número de threads que participam da reciclagem paralela. Como o reciclador em série, a execução de todos os threads de aplicativos é suspensa durante a reciclagem. Comparado aos recicladores paralelos, a geração mais antiga tem um tempo de reciclagem mais curto, reduzindo assim o tempo de pausa. Forçado a especificar via XX:+Use a opção de linha de comandoPoLODOLDGC.
① Coleção minúscula para gerações jovens
O mesmo que colecionador paralelo
②O algoritmo de reciclagem para idosos (coleção completa)
Os idosos são divididos em três etapas: marcação, contagem e fusão. A idéia de divisão é usada aqui e a geração antiga é dividida em muitas regiões de tamanho fixo. No estágio de marcação, todos os objetos sobreviventes são divididos em n grupos (o número de roscas recicladas deve ser o mesmo que o número de roscas recicladas). Cada encadeamento é independentemente responsável por seu próprio grupo, marcando a localização dos objetos sobreviventes e as informações da taxa de sobrevivência da região (região) e marcando -a como paralelas. No estágio estatístico, a taxa de sobrevivência de cada região é contada. Em princípio, a taxa de sobrevivência na frente é relativamente alta. De frente para trás, a posição inicial que vale a pena se fundir é encontrada (as áreas onde a maioria dos objetos sobrevive não vale a pena se fundir). O estágio estatístico é serial (thread único). No estágio de mesclagem, com base nas informações no estágio estatístico, vários threads copiam os objetos sobreviventes de uma região para outra região em paralelo.
Colecionador simultâneo de sweep
Também conhecido como coletor de baixa latência, o aplicativo é suspenso por um tempo mais curto por vários meios. Basicamente, executa operações de reciclagem simultaneamente com o aplicativo, sem fusão e cópia operações. Especificado através da linha de comando -xx:+useConcmarksweepGC, você também pode especificar o uso do modo de reciclagem incremental -xx:+useConcmarksweepGC em sistemas de núcleo único ou de núcleo duplo. A reciclagem incremental refere -se à divisão da operação de reciclagem em vários fragmentos, executando um fragmento e liberando os recursos da CPU para o aplicativo e continuando a reciclar o último resultado em um determinado ponto no futuro. O objetivo também é reduzir o atraso.
① Coleção minúscula para gerações jovens
O mesmo que colecionador paralelo
②O algoritmo de reciclagem para idosos (coleção completa)
É dividido em quatro etapas: marca inicial, marca simultânea, observação e varredura simultânea. Preste atenção especial, não há operação de mesclagem; portanto, haverá fragmentos.
Ferramenta de avaliação de desempenho para coletor de lixo Java
①xx:+printgcdetails e xx:+printgctimestamps
Informações sobre o horário de início, duração, memória sobressalente de cada geração, etc.
②jmap [Opções] PID
JAMP 2043 Ver objetos compartilhados que foram carregados no processo 2043. Normalmente arquivos DLL.
JMAP -HEAP 2043 Verifique as informações de configuração e o uso da pilha de memória.
JMAP -Permstat 2043 Verifique o status de carregamento da geração permanente.
JMAP -HISTO 2043 Verifique o uso de carregamento e memória da classe.
③jstat [Opções] PID
JSTAT -Class 2043 Carregamento, descarregamento, uso de memória.
JSTAT -GC 2043 GC Status de execução.
PostScript
O Java fornece funções automáticas de seleção e otimização automática de desempenho. Antes de fazer o ajuste do coletor de lixo, liste primeiro os indicadores de desempenho com o qual você está preocupado, informe à JVM os indicadores de desempenho com os quais você está preocupado através da linha de comando e ajustado automaticamente pela JVM. Se você não estiver satisfeito, pode especificar o coletor de lixo. O outOfMemory geralmente se deve à memória de heap insuficiente, para que você possa ajustar as linhas de comando -xmx1024m e -xx: maxpermsize = 128m.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.