Otimização de desempenho Java--Introdução à reciclagem geracional

Continue a criar, acelere o crescimento! Este é o 27º dia da minha participação no "Nuggets Daily New Plan · June Update Challenge", clique para ver os detalhes do evento

O artigo anterior apresentou o conteúdo da coleta de lixo, que é equivalente a uma introdução.A partir deste artigo, vamos falar sobre os detalhes da coleta de lixo. Como a coleta de lixo reduz parar o mundo? Este será o foco da coleta de lixo.

O que é reciclagem geracional?

O que é reciclagem geracional, os alunos que estão em contato com ela pela primeira vez devem estar muito confusos. Lembre-se de que, quando introduzimos a jvisualvmferramenta anteriormente, vimos pela visualização que ela nos dava o feedback de que havia vários blocos de dados diferentes e eram dinâmicos, conforme mostrado no círculo vermelho na figura a seguir:

imagem.png

Da esquerda para a direita são:

  • Metaespaço: Metaespaço
  • Velho: velhice
  • Eden + S0 + S1: Esses três juntos são chamados de geração jovem

Até agora, os coletores de lixo comuns no mercado são todos coletados de acordo com esse método de coleta geracional, mas seus métodos de implementação internos são muito diferentes.

Neste capítulo, nosso foco está nas gerações mais velhas e mais novas.

A partir da figura acima, descobrimos que a geração jovem consiste em três partes:

  • Eden: Normalmente chamado de Eden District, também pode ser chamado de Eden District na tradução.
  • S0 e S1: Normalmente chamada de área de sobrevivente, traduzida como área de sobrevivente, composta por sobrevivente 0 e sobrevivente 1.

Por que usar a reciclagem geracional?

A grande maioria dos objetos, seu ciclo de vida é muito curto, mesmo a grande maioria dos objetos temporários, o design do coletor de lixo precisa se adaptar a essa situação.

Todos nós sabemos que os objetos são criados e armazenados no heap, e tanto as gerações antigas quanto as novas fazem parte do heap.

Reciclagem da nova geração

Quando um objeto é criado, ele será alocado para a geração jovem. À medida que o número de objetos aumenta, a geração jovem será preenchida. Neste momento, todas as threads do aplicativo serão interrompidas e a coleta de lixo será realizada. Objetos que não são usados ​​serão reciclados e os objetos que ainda estiverem em uso serão movidos para outro lugar. Esta operação é MinorGCa reciclagem da geração jovem.

A razão mais fundamental para usar o algoritmo geracional é minimizar as pausas causadas pela coleta de lixo. Podemos considerar os dois aspectos a seguir:

  • A nova geração faz parte do heap, e apenas o processamento de uma parte do espaço deve ser menor que todo o espaço do heap, e o tempo de pausa também é menor. Mas devemos esperar que a frequência das pausas tenha aumentado.

  • 年轻代的空间分配方式,对性能有影响。年轻代中,eden占据大部分空间,而S0和S1平分剩余空间。对象首次创建会在Eden中,经过一次垃圾回收时,Eden被清空,未使用的对象被回收,仍然使用的对象进入Survior或老年代。Eden区的清空操作,相当于进行了一次压缩整理

即使是年轻代的回收,仍然存在时空停顿

老年代回收

前面提到,除了在Eden可能将对象移动到老年代当中,对于在Survior当中没有被回收的对象,最终也会移动到老年代当中。当老年代被占满时,会停止所有的应用线程,找到不再使用的对象进行垃圾回收。这个过程将会停顿很长时间,我们称之为Full GC

更加厉害的回收方式

前面的描述其实都是较为简单的垃圾收集器,在停止应用线程后去发现不再使用的对象,进行回收。

然而实际上,通过一些定制,和复杂的计算,我们可以在应用线程运行时去找到不再使用的对象。在前一篇文章一笔带过的CMS和G1收集器,就是如此。他们不需要停止应用线程就可以找到不再使用的对象,所以它们也叫做concurrent垃圾收集器

垃圾在查找的时候将会占用很多时间,当然查找算法将是下一章节我们需要学习的内容。然而concurrent垃圾收集器可以尽可能的减少应用的停顿时间,它们也可以称为低停顿收集器

这种垃圾收集器缩减应用的停顿时间,其代价是占用更多的CPU。即使是G1和CMS也会遇到长时间的Full GC,这将是我们需要针对实际环境调优的方向。

垃圾收集器的权衡

前面简单描述了不同垃圾收集器的垃圾收集方式,以及造成的影响。但是在我们选择垃圾收集器的过程中还是需要一定的权衡,才能使其发挥最佳的性能。

我们需要考虑的重点就是:

  • 吞吐量:如果你的系统需要大批量的处理数据等,换句话说,不要求每次响应时间最快,而平均响应时间更加重要,Parallel收集器也许会有不错的表现。
  • 响应时间: Em suma, se você deseja que sua interface obtenha um tempo de resposta mais rápido, o coletor simultâneo será uma escolha melhor.
  • CPU性能: Usar o coletor atual inevitavelmente consumirá mais recursos da CPU.

Este artigo descreve muito.No próximo artigo, veremos em detalhes o algoritmo de coleta de lixo.

おすすめ

転載: juejin.im/post/7112224181613232159