Gc programa Caton? Mudei o G1 sentar e relaxar (do princípio idade análise coletor de lixo)

caso clássico:
um servidor de memória heap 2G recurso, PV 50 milhões e local de feedback do usuário mais lentamente. Assim, a empresa decidiu atualizar o servidor, de modo a expansão de memória heap para 16 G.
No entanto, o feedback do usuário Caton é muito grave, mas menor eficiência.

Alguns podem estar familiarizado com a JVM não é bastante estudantes será claro por que. Na verdade, neste momento, o ambiente de produção para ajustar a JVM ainda é muito importante. Embora um mecanismo sandbox, como Java, que ajudam a proteger o trabalho das diferenças entre os vários sistemas operacionais e recuperação da memória. Mas por causa disso, muitos programadores vão entender os mecanismos subjacentes e, portanto, não consigo entender os problemas encontrados em um ambiente de produção.

Assim, a fim não só para fazer um baixo nível programadores CRUD branco, devemos conhecer uma parte do conhecimento subjacente mais importante relacionado (o conhecimento da ciência subjacente é interminável), para ajudar-nos melhorar um padrão de todo. A fim de ser capaz de gerar um ambiente real, para que os projectos próprios eficientes e estáveis.

(Na verdade, o começo eu estava tentando terminar um artigo na JVM, mas escreveu apenas para descobrir que o conhecimento é muito grande, ele não pode realmente colocar um post no blog)

A razão o desenvolvimento coletor de lixo

Na verdade, pela primeira vez, os programas Java não são graves, pois a coleta de lixo Caton. Mas com o desenvolvimento da tecnologia, coletor de lixo cru Java lentamente um problema sério.

Uma razão muito importante é o tamanho da memória ! ! !

Eu estou aqui para dar uma imagem de exemplo para ajudar você a entender.

  • coletor de lixo, é lixo um espaço.
    Ele é, por exemplo, em sua casa, há uma pequena sala, seus filhos brincar com ela, e no processo de continuar a jogar, criando mais e mais lixo.
  • E ele não é uma criança para limpar o seu próprio lixo, e desta vez, é a sua vez para os pais (o equivalente a um coletor de lixo), segurando uma pequena vassoura para limpar o seu filho dentro do lixo casa.
  • Este processo tem um pequeno detalhe, é que o seu filho não está se divertindo, enquanto a geração de resíduos, ao mesmo tempo que você limpar.
    Porque antes de limpar o lixo, você precisa colocar os itens acima de olhar através de ver o que é lixo, confirmou antes que possa ser limpo.
    Se seu lixo produto lado, enquanto você limpa, você não pode distinguir o que é spam eo que não é spam. Então, se a corrida para limpar, é fácil de limpar algumas coisas que você não deve ter que limpar, por isso irá causar erros imprevisíveis de (seu filho pode ser um colapso mental), finalização anormal do programa.
    Então, é claro, não pode limpar o lixo, resultando em lixo residual.
  • Assim, você revelando parentalidade majestade, deixá-lo cessar todas as actividades (parar o mundo, conhecido como STW), você primeiro limpar o lixo, você esperar até o final do trabalho de limpeza depois que ele pode continuar suas atividades.
  • Desta forma, você pode basicamente garantir o seu lixo criança gerada durante a atividade pode ter continuado a ser recuperado, então o quarto pode ter espaço, o seu filho não vai, eventualmente, ser enterrado lixo.

Tudo isto inicialmente parece muito harmonioso. Mas aos poucos, o mundo mudou.

Devido ao contínuo desenvolvimento da economia mundial e da tecnologia, temos sido capazes de comprar mais máquinas e mais avançados, tudo parece próspero, mas o equivalente de sua casa está crescendo.
Neste momento, você pode limpar o cada vez mais onerosa.

  • Uma vez, enquanto você varrer um pequeno quarto;
  • E agora, você tem que digitalizar uma enorme Praça Tiananmen.
  • Uma vez, um será capaz de gastar tanto tempo quanto você limpa sua cabine;
  • Agora, você não necessariamente varrer varrer vários dias e noites de completa uma grande praça tal.

A memória heap original está disposto a ser apenas alguns megabytes, e agora a memória heap, pode ter dezenas, centenas de megabytes, ou mesmo T.
Portanto, o coletor de lixo continuará a desenvolver, mas também têm um trabalho JVM tuning.

E a razão que citei no início do caso, é precisamente porque a memória é expandido, gc cheia devido ao tempo prolongado.

Tipos e princípios do coletor de lixo

colector de lixo com um único segmento (série)

O coletor de lixo inicial Java, juntamente com o conjunto nascimento (Java 1 versão do coletor padrão), que é um coletor de single-threaded, e funciona bem.
Porque, então, a memória da máquina é ainda pequena e substancialmente CPU de um único núcleo. Então, coletor de lixo single-threaded é muito apropriado.

Este coletor de tempo coletor de lixo de lixo para o Serial:
Serial (responsável pela recolha a geração mais jovem) e Old série (anos responsáveis de idade)

Onde a geração jovem usando o algoritmo de cópia familiarizado, usando a marca de idade - algoritmos de ordenação.
(Eu não vou entrar em detalhes muito básico a)
Serial
coletor de lixo Serial como demasiado simples, tem sido difícil de aplicar à corrente de alta performance, multi-CPU, grandes máquinas de servidor de memória para usar.

  • Cada STW tempo, porque apenas um thread para a coleta de lixo, será um desperdício grave da natureza paralela das vantagens de CPU multi-core
  • Juntamente com memória aumentando, dezenas de megabytes diárias para a pequena série de memória parece ser inadequada, algoritmo de coleta de lixo comum fará com que o tempo que as pessoas não podem ficar esperando para o programa

Mas isso não significa que a série completamente inútil

  • Em primeiro lugar, para algumas máquinas mais velhas, no caso de apenas um núcleo, colector de lixo com um único segmento terá uma maior eficiência do que vários segmentos (para evitar a multi-roscada interruptor contexto em cima)
  • Não só isso, por algum programa de pequena escala por causa de seu algoritmo simples, uma série pode lidar com isso, e o baixo custo do sistema é mais complexo do que o coletor de lixo.
    Portanto, em um do lado do cliente pequeno programa, ainda estamos usando o coletor de lixo de série padrão.

colector de lixo multi-threaded (PS + PO)

Serial coletor de single-threaded no mercado atual, afinal, só pode ir em um procedimento de pedido de pequeno porte.
Para os nossos grandes servidores, ele definitivamente não é usar um coletor de lixo tão velho single-threaded (você tem que varrer Tiananmen, em todo caso tem que ir com um grupo de cara jovem e forte, um avô e não deixar ir sozinho).

Para manter o ritmo, coletor de lixo de multi-threaded nasceu. (Desde então, a coleta de lixo não têm mais um homem sozinho, e muitas mãos fazem a luz)
em que o Scavenge Parallel responsável pela geração jovem, Paralela Antigo responsável da idade
PS + EN
Tome nosso mais popular Java 1.8, agora a coleta de lixo padrão é ainda o PS + PO, ele mostra realmente bom.

Mas tenho que admitir, embora ele melhora a eficiência de coleta de lixo por multi-threading, no entanto, a face da memória aumentando, mesmo se o segmento tem aumentado, reciclagem STW pode ainda insuportável
, algumas centenas, memória para vários G, PS + PO combinação de multi-threading ainda é muito bom, no entanto, continuou a se expandir na memória, a situação de dezenas de G, PS + PO multithreaded combinação ainda haverá uma pausa STW longo tempo.

Ainda assim, ele herda as vantagens da geração anterior de coletor de single-threaded, dedicado em coleta de lixo, cessar todo o segmento do usuário operações, por isso é rendimento muito impressionante (no caso da prossecução da prioridade rendimento, ainda recomendar uma combinação PS + PO ).

Época de tomada de colecionador "concorrente" (CMS)

Tem a dizer o coletor de lixo CMS, é um produto que marcaram época.
(Como fez concorrente coleção)! ! !

meios de coleta de lixo simultâneas que o coletor de lixo pode, enquanto no caso da linha de trabalho do usuário, ao mesmo tempo, enquanto a limpeza do lixo. Desta forma, não é susceptível de causar longa STW pausa.

Voltando à nossa analogia anterior, suponha que no caso do seu filho enquanto joga e quando você limpar o lixo, então você não vai porque as crianças STW em casa sem ser capaz de continuar a jogar e iria explodir.

processo de coleta de CMS é dividido em quatro etapas:

  1. A marca inicial
  2. marcação simultânea
  3. relabel
  4. limpeza Concurrent

Após a recolha de tempo de lixo feita a análise estatística verificou que a parte mais demorada do recolha de lixo é (marca concorrente na figura), durante este tempo, então, CMS irá ser a parte mais demorada do utilizador ao mesmo tempo de execução tópicos.

  1. A marca inicial logo, não há nenhum fio interferência utilizador, e marcado apenas uma pequena parte do objecto relacionado gc-raiz;
  2. marca concorrente no início, pouco a pouco é encontrar todos os objetos sem uso, ao mesmo tempo, devido ao usuário rosca coleta de lixo, constantemente operando objeto pode alterar o estado do objeto, de modo que esta marca concorrente processo o mais complexo e demorado;
  3. Remarcado em breve, porque o objeto foi marcado basicamente concluída, e que o usuário passe nenhuma interferência, única, finalmente, para garantir a integralidade e exactidão;
  4. threads do usuário juntos e continuar a limpar o lixo, reduzir STW.
    CMS

Na verdade, não estão previstas antes da coleta de lixo simultânea por um longo tempo, mas nunca realmente perceber até demasiado, porque a dificuldade é enorme.
Suponha que, enquanto você varrer o chão, o seu filho está constantemente a tirar o lixo, como você varrer? ? ?
Assim nasceu as voltas e reviravoltas CMS, que leva um longo tempo, e também tem sido criticado por uma série de problemas (fragmentação de memória, flutuante de lixo).

Assim, cada versão CMS no JDK não é o coletor de lixo padrão (apesar CMS, mas ainda obter o JVM PS + PO fazer coletor padrão, use a CMS deve ser especificado manualmente).

CMS é a recuperação do coletor de idade avançada, que usa uma marca - varredura algoritmo.
Nós todos sabemos, marca - algoritmo de varredura é o algoritmo coletor mais básico de lixo, simples e eficiente de cobrança, CMS STW para reduzir o atraso causado pelo algoritmo de coleta de lixo.
Mas também sabemos que este algoritmo coleção tem uma falha fatal, isto é, a fragmentação da memória.
Mark - Clear
Assim, com a coleta de lixo continuam a ocorrer, a fragmentação da memória vai se tornar cada vez mais grave, tornaram-se uma memória em pequenos pedaços, desta vez, se houver grandes objetos precisam para entrar, pode ser memória total suficiente, mas não uma peça contínua de memória pode ser atribuído a ele.

A segunda edição do CMS é: Flutuante lixo
porque CMS permite que parte do processo de coleta de lixo, o segmento de usuário pode continuar a executar a tarefa. Então,
quando a coleta de lixo, que continuará a produzir lixo, por isso vai ter um lixo flutuante.
Portanto, tal situação um pode surgir quando o coletor de lixo para executar o usuário destina gerados novos tópicos continuam a ocupar memória e, em seguida, a memória de repente não é suficiente.

Ambos os casos são CMS problema fatal, não o suficiente espaço de memória:
1, a fragmentação de memória, não é suficiente memória contígua
2, a recuperação continuou a produção, levando à insuficiência de memória

Neste momento, CMS não pode ser resolvido, então, a fim de prevenir programa jeito, CMS seria pedir a régua para fazer:
Velho (avô single-threaded) coleta de lixo Serial

Então, de vez em quando para PS + PO quando, dez minutos poderia seriamente a coleta de lixo, os resultados para um CMS, um dia, de repente, cartão, um cartão que é dezenas de horas. . . . .

Paralelo Scavenge (PS) da versão modificada (ParNew)

Na verdade, multi-threaded Scavenge paralela (PS) geração mais nova colector de multi-threaded foi muito boa. Ele é usado e paralela Velho (PO) com o uso.

Mas, depois de CMS nasceu, a geração mais jovem não tem um coletor de lixo e usá-lo para ir com, então,
coletor de lixo Scavenge Parallel foi modificado para especificamente para uso com o CMS.

coletor de grande desenvolvimento de lixo (G1)

G1 é um colector de lixo para ser executado no lado do servidor, o objectivo é a utilização de vários núcleos, uma grande máquinas de memória, que pode atingir os tempos de pausa GC especificados na maioria dos casos, e para manter uma alta taxa de transferência.

Mas por G1 CMS para resolver o problema, bem como a capacidade para atender mais memória? ? ?

lógica geracional, independentemente da substituindo física

Aprendemos com o passado espaço de memória JVM de tempo, sabemos que a pilha para a geração mais jovem, anos, e a geração mais jovem deve ser dividida em área sobrevivente Eden District.
É tudo sobre a nova geração de algoritmo de replicação altamente eficiente, e objeto comum no ano de idade para reduzir a marca - frequência de acabamento.

No entanto, G1 começar a quebrar o padrão (lógica geracional, mas em nome da memória física não é dividida)

Por uma grande memória heap é dividido em uma pequena região a meio da política partição, reciclagem bloco, para reduzir o atraso de resposta.
Em seguida, uma das razões G1 baixa latência.
G1

Mesa de cartas

Primeiro a mencionar um conjunto cartão conceito

Quando nos recusamos coleção, o primeiro passo é determinar primeiro a sobrevivência do assunto. (Todos nós sabemos que para determinar a sobrevivência do objeto, enquanto a pesquisa a partir da raiz, pode alcançar todos os objetos vivos)

Quando menor GC, só precisamos para limpar a nova geração de resíduos.
No entanto, há um ponto muitas pessoas podem não querer ir para lá:

  • Ou seja, a nossa geração jovem, referências de objeto pode ser velho em anos
  • A meta de idade é referenciado na geração jovem pode

Portanto, há um problema muito problemático, nós temos que ir limpar a nova geração de lixo, no entanto, não estamos apenas indo para digitalizar os objetos geração de jovens, mas também objetos à idade avançada de digitalização. (Isto é muito antieconômico)
jogo de cartão
tornou-se uma parte da JVM, incluindo um cartão
quando o cartão tem um objeto, remete para a geração mais jovem, coloque este card marcado;
assim, depois indo só para atravessar o cartão é marcado objetos, outro tubo não ter sido não marcado, melhorando assim a eficiência.

A tabela registro é bitmap bitmap (não sei para compensar a fundação)

Analogia, se suas mãos cem suites, você vai ver o que está sendo alugado.
Neste momento, as mãos são um registro na tabela, você pode determinar qual destes edifícios têm um piso para alugar. Desta forma, você só tem que ir para aqueles que foram rotulados chão para dar uma olhada, o que se camada de alguém, melhorando assim a eficiência.
mesa de cartas

Jogo da coleção

Conjunto de coleta de mencioná-lo apenas de passagem, e deve ser distinguido Lembre-Set

Conjunto de coleta de dentro da loja para ser reciclado são alguns objetos que podem vir de Éden, sobrevivente, Antigo cada partição, nos dados de sobrevivência coleção Set é movido de uma partição para outra partição no GC.

Lembre-Set

O foco deve mencionar é que Lembre-Set:
em cada região G1, são armazenados com uma Lembre-se Set, ele registra um objeto em uma referência à outra região na região.
Isso faz com que o coletor de lixo não precisa fazer a varredura de toda a pilha para descobrir quem consulte a partição alvo atual, basta ir Lembre-se configurado para verificar.

Para alcançar Lembre Set (RSet), então toda vez que você precisa fazer algum trabalho extra quando é dada uma referência para o objeto:
me lembro Set em um registro (chamado a barreira de gravação no GC)
Nota: Esta barreira de escrita e nenhuma barreira de memória metade centavo! ! ! (Não tome pulverizar entrevistador)
lembre-set

MixedGC

Em primeiro lugar, recolha G1 lixo, mais do que MinorGC, FullGC, que também tem um mecanismo de recolha de lixo:
MixedGC

processo de recuperação MixedGC e CMS sobre o mesmo (equivalente a uma versão de simulação CMS):

  1. A marca inicial
  2. marcação simultânea
  3. A classificação final
  4. Triagem reciclagem (para resolver o problema da fragmentação de memória)

As três primeiras etapas são quase os mesmos, mas a última etapa é muito diferente.
Ele irá filtrar a maior parte do lixo, a maioria da necessidade Região a ser recuperado, então, vai esta região com o algoritmo de replicação, copiado diretamente para outra região peça, e comprimido, este iria resolver o problema da fragmentação de memória CMS.
mixedgc

Três cores marcador + SATB

Sabemos que, mesmo CMS G1, que é o mais crítico é a marca concorrente (que faz coleta de lixo de rosca e de trabalhadores tópicos podem ser executados simultaneamente)

O ponto-chave marca concorrente é o algoritmo marcador três cores! ! !

  1. Black: que eles foram marcados, e todos os seus filhos têm sido rotulado como um (nota neto não é necessariamente marca)
  2. Gray: que eles foram marcados, mas seus filhos não foi marcado
  3. Branco: ele disse que não foi marcado

Três conceito marcador de cor é simples de entender, é se o registro é marcado si, bem como crianças.
Três Marker Color
Mas o problema é que o marcador de três cores:
Como a marca de utilizador e é ao mesmo tempo de execução tópicos, e, portanto, podem aparecer fenómeno fuga marcada.

  • Assume-se que um objecto de preto, se um ponto de referência para o objecto branco (ver Figura)
  • Então, este objetos cinzas, apontando para sua dereference objeto branco,
  • Então, neste momento porque o objeto de destino tem vindo a apontar para o branco é preto (crianças representados foram digitalizados, embora não realmente)
  • Portanto, um objeto branco será marcado vazamento
    Três Marker Color
    , a fim de resolver a simultaneidade geração bandeira de drenagem standard, temos de mudar a situação registrada

Existem duas opções:

  1. (Atualização periódica)
    registro referências recém-adicionados:
    o preto em vez cinza
  2. (SATB: instantâneo no início)
    de referência faltando registro:
    Ao se referir a cancelar, não citar diretamente descartado, mas salvo

Desta vez, você pode pensar sobre si mesmo, que tipo de uma boa maneira.

--------------- ---------------- linha divisória lindo

Embora duas maneiras de conseguir o mesmo efeito, no entanto,

  1. Nós olhamos para o primeiro método, vamos marcar a última vez final, queremos que esses objetos de preto esmaecido novamente para re-scan novamente,
    aumentando assim o número de digitalizações e afetar a eficiência
    (especialmente a criança negra ainda está sujeita particularmente quando)
  2. E em segundo lugar, apenas para salvar referências adicionais, só precisa gastar um pouco de espaço,
    mas sem repetição dos casos de objetos digitalizados, o que pode salvar GC tempo

Então, nós certamente pode escolher a segunda, porque G1 é resolver o nosso muito tempo STW GC-;
G1 no uso prático desse método de procedimento, quando a referência de objeto foi cancelada, será empurrado para as referências de pilha,
da próxima vez para obter este tipo de exame de referência, devido à presença Lembre Set (RSet), ele não é mais necessário verificar a pilha inteira para encontrar um ponto de referência para o objeto branco é
assim, no G1, Lembre-se Set (RSet) e fusão perfeita SATB.

Mas no CMS utilizado é o primeiro método, o G1 também melhora a este por uma escassez de CMS.

Outro coletor de lixo

ZGC Eu não tenho que lhe dizer, por causa do tempo ZGC não parece particularmente longa, e eu entendo que não é suficiente profundidade. Por isso estou aqui temporariamente para não entrar em detalhes, mas também pode ir online para procurar algum outro blog para ter algum conhecimento dele.
O mesmo é verdadeiro coletor de lixo Shenandoah.

Mas podemos saber é que a partir do G1 começando, o coletor de lixo é para grande memória, baixa resposta, seu objetivo é o mesmo, mas a memória não é do mesmo tamanho variam aplicável,
G1 pode ser aplicado a partir de dezenas de G, ao cem memória do G, e ele pode ser usado na memória T ZGC.

Outra chamada Epsilon, o coletor de lixo não é usado para resíduos reciclar. . . . Não recupera.
Assim, é apenas para usar o depurador, em vez de no ambiente de produção.

O mapa colector de lixo resumidos

Quando o superior representa a geração mais jovem (Serial, ParNew, Scavenge Paralela) ,
o seguinte representa anos de idade (CMS, Antigo Serial, Paralela Velho )
em que a linha sólida representa a conexão que são comumente usados em coletor de lixo combinação, as linhas tracejadas geralmente não.

Enquanto G1 geracional lógico, mas fisicamente ele tem grandes gerações, mas dividido em pequenos pedaços Região
desde o início completamente independentemente gerações ZGC.
Tipo de coletor de lixo

Autor de

Na verdade, o tempo de escrita do artigo é mais curto do que eu estimado, cerca de 6 horas (provavelmente porque desenho ligeiramente ponto arrastado no tempo, ou será mais curto).
Depois de um início ao fim e então eu quero transformar coletor de lixo com mais, para escrever sobre sobre o ajuste do JVM. (Mas encontrado o conteúdo é muito grande, não é adequado para um aglomerado de escrever)

A razão pela qual nós temos que aprender JVM, é ir sintonia! ! !

Agora JVM conhecimento também entrevistar os mais atingidos, um programador se o JVM subjacente é uma certa compreensão (claro, você realmente não ver o código Hotspot máquina virtual de origem, o tempo e profundidade de renda e não paga), então ele está no programa o processo de preparação evitará a uma série de problemas, e melhorar a eficiência de fazer certo.
Não só isso, devido aos inconvenientes do coletor de lixo de gerações anteriores, tornando o problema um monte de ambientes online e de produção e, portanto, precisa ter excelente equipe proficiente na JVM capaz de resolvê-los, encontrar ideias e soluções.

Encorajar uns aos outros.

Publicado 12 artigos originais · ganhou elogios 146 · vê 20000 +

Acho que você gosta

Origin blog.csdn.net/weixin_44051223/article/details/105078904
Recomendado
Clasificación