Pergunta

Estou tentando entender quais são os conceitos de jovem, velho e gerações permanentes estão na terminologia de heap Java e, mais especificamente, nas interações entre as três gerações.

Minhas perguntas são:

  • Qual é a geração jovem?
  • Qual é a velha geração?
  • Qual é a geração permanente?
  • Como as três gerações interagem/se relacionam entre si?
Foi útil?

Solução

Parece um mal -entendido comum. Na JVM da Oracle, a geração permanente não faz parte da pilha. É um espaço separado para definições de classe e dados relacionados. No Java 6 e anteriores, as cordas internadas também foram armazenadas na geração permanente. No Java 7, as cordas internadas são armazenadas na pilha de objeto principal.

Aqui está um bom post sobre geração permanente.

Eu gosto das descrições dadas para cada espaço no Oracle's Guia sobre JConsole:

Para o hotspot java vm, os pools de memória para coleta de lixo em série são os seguintes.

  • Eden Space (Heap): O pool a partir do qual a memória é alocada inicialmente para a maioria dos objetos.
  • Espaço de Sobrevivente (Heap): A piscina que contém objetos que sobreviveram à coleta de lixo do espaço do Éden.
  • Geração titular (Heap): o pool que contém objetos que existem há algum tempo no espaço do sobrevivente.
  • Geração permanente (não-heap): o pool contendo todos os dados reflexivos da própria máquina virtual, como objetos de classe e método. Com as VMs Java que usam o compartilhamento de dados da classe, essa geração é dividida em áreas somente leitura e leitura.
  • Cache de código (não-heap): A VM Java Hotspot também inclui um cache de código, contendo memória usada para compilação e armazenamento de código nativo.

Java usa coleta de lixo geracional. Isso significa que, se você tiver um objeto Foo (que é uma instância de alguma classe), quanto mais eventos de coleta de lixo ele sobrevive (se ainda houver referências a ele), quanto mais é promovida. Começa na geração jovem (que por si só é dividida em vários espaços - Éden e Survivor) e acabaria acabando na geração titular se sobrevivesse o suficiente.

Outras dicas

A Pilha é dividida em jovens e velhas gerações da seguinte forma :

Geração Jovem :É um lugar onde viveu por curto período, divididos em dois espaços:

  • Eden Espaço :Quando o objeto é criado utilizando a nova palavra-chave de memória alocada sobre este espaço.
  • Sobrevivente Do Espaço :Este é o conjunto que contém os objetos que têm a sobreviveu depois que o java coleta de lixo do jardim do Éden espaço.

Velha Geração :Este conjunto contém basicamente permanente e virtual (reservado) de espaço e realizará os objetos que sobreviveram após a coleta de lixo de Geração de Jovens.

  • Cadeira De Professor De Espaço: Este conjunto de memória contém objetos que sobreviveu depois de vários coleta de lixo significa o objeto que sobreviveu depois de coleta de lixo de Survivor espaço.

Permanente Geração : Este conjunto de memória como o nome diz também contêm permanente classe de metadados e descritores de informações para PermGen space sempre reservado para aulas e aqueles vinculados às classes, por exemplo, membros estáticos.

Java8 Atualização: PermGen é substituído com Metaspace o que é muito semelhante.
A principal diferença é que Metaspace re-tamanhos dinamicamente por exemplo, Ele pode expandir em tempo de execução.
Java Metaspace espaço:unbounded (padrão)

Cache De Código (Virtual ou reservado) :Se você estiver usando o HotSpot Java VM isso inclui cache de código de área que contém a memória que será utilizada para a compilação e armazenamento de código nativo.

enter image description here

Cortesia

Qual é a geração jovem?

O Geração jovem é onde todos os novos objetos são alocados e envelhecidos.Quando a geração mais jovem lota, isso provoca uma pequena coleta de lixo.Uma geração jovem cheia de objetos mortos é coletada muito rapidamente.Alguns objetos sobreviventes envelhecem e eventualmente passam para a geração antiga.

Qual é a velha geração?

O Velha Geração é usado para armazenar objetos que sobreviveram por muito tempo.Normalmente, um limite é definido para o objeto da geração mais jovem e quando essa idade é atingida, o objeto é movido para a geração mais antiga.Eventualmente, a velha geração precisa ser recolhida.Este evento é chamado de grande coleta de lixo

Qual é a geração permanente?

O Geração permanente contém metadados exigidos pela JVM para descrever as classes e métodos usados ​​no aplicativo.A geração permanente é preenchida pela JVM em tempo de execução com base nas classes em uso pelo aplicativo.

PermGen foi substituído pelo Metaspace desde o lançamento do Java 8.

PermSize e MaxPermSize parâmetros serão ignorados agora

Como as três gerações interagem/se relacionam entre si?

enter image description here

Artigo sobre fonte de imagem e tutorial do Oracle TechNetwork: http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

"O Processo Geral de Coleta de Lixo"no artigo acima explica as interações entre eles com muitos diagramas.

Dê uma olhada no diagrama resumido:

enter image description here

A máquina virtual Java é organizada em três gerações: uma geração jovem, uma geração antiga e uma geração permanente. A maioria dos objetos é alocada inicialmente na geração jovem. A geração antiga contém objetos que sobreviveram a algum número de coleções de gerações jovens, bem como alguns objetos grandes que podem ser alocados diretamente na geração antiga. A geração permanente mantém objetos que a JVM considera conveniente que o coletor de lixo gerencia, como objetos que descrevem classes e métodos, bem como as próprias classes e métodos.

A memória na JVM de SunHotspot é organizada em três gerações: geração jovem, geração antiga e geração permanente.

  • Geração jovem: os objetos recém -criados são alocados para a jovem gen.
  • Generação antiga: se o novo objeto solicitar um espaço de pilha maior, ele será alocado diretamente para a geração antiga. Também objetos que sobreviveram a alguns ciclos do GC são promovidos para a antiga casa dos objetos de vida de vida longa em Old Gen.
  • Geração permanente: A geração permanente mantém objetos que a JVM considera conveniente que o coletor de lixo gerencia, como objetos que descrevem classes e métodos, bem como as próprias classes e métodos.

FYI: O GEN permanente não é considerado parte da pilha de Java.

Como as três gerações interagem/se relacionam?Os objetos (exceto os grandes) são alocados pela primeira vez à geração jovem. Se um objeto permanecer vivo após x não. dos ciclos de coleta de lixo, ele é promovido para o antigo/titular. Portanto, podemos dizer que o jovem gene contém os objetos de vida curta, enquanto o antigo gene contém os objetos que têm uma vida longa. O GEN permanente não interage com as outras duas gerações.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top