Estou tentando entender quais são os conceitos de gerações jovens , velhas e permanentes 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 geração antiga?
- Qual é a geração permanente?
- Como as três gerações interagem / se relacionam?
Respostas:
Isso parece um mal-entendido comum. Na JVM da Oracle, a geração permanente não faz parte do heap. É um espaço separado para definições de classe e dados relacionados. No Java 6 e versões anteriores, as cadeias internas também eram armazenadas na geração permanente. No Java 7, cadeias internas são armazenadas no heap do objeto principal.
Aqui está um bom post sobre geração permanente .
Gosto das descrições fornecidas para cada espaço no guia da Oracle no JConsole :
Java usa coleta de lixo geracional. Isso significa que, se você tiver um objeto foo (que é uma instância de alguma classe), mais eventos de coleta de lixo sobreviverão (se ainda houver referências a ele), mais ele será promovido. Começa na geração jovem (que em si é dividida em vários espaços - Eden e Survivor) e acabaria na geração ocupada se sobrevivesse por tempo suficiente.
fonte
Geração jovem : É o local onde moramos por um curto período e divididos em dois espaços:
Geração antiga : esse pool basicamente contém espaço virtual e reservado (reservado) e manterá os objetos que sobreviveram após a coleta de lixo da Geração Jovem.
Geração permanente: esse conjunto de memórias, como o nome também diz, contém informações permanentes sobre metadados e descritores de classe, portanto o espaço PermGen sempre fica reservado para classes e aqueles que estão vinculados às classes, por exemplo, membros estáticos.
Cache de código (virtual ou reservado): se você estiver usando o HotSpot Java VM, isso inclui a área de cache de código que contém a memória que será usada para compilação e armazenamento do código nativo.
Cortesia
fonte
A Geração Jovem é onde todos os novos objetos são alocados e envelhecidos. Quando a geração jovem se enche, isso causa uma pequena coleta de lixo. Uma geração jovem cheia de objetos mortos é coletada muito rapidamente. Alguns objetos sobreviventes são envelhecidos e, eventualmente, passam para a geração antiga.
A geração antiga é usada para armazenar objetos que sobreviveram por muito tempo. Normalmente, um limite é definido para o objeto de geração jovem e, quando essa idade é atingida, o objeto é movido para a geração antiga. Eventualmente, a geração antiga precisa ser coletada. Esse evento é chamado de coleta de lixo principal
A geração Permanente contém metadados exigidos pela JVM para descrever as classes e métodos utilizados no aplicativo. A geração permanente é preenchida pela JVM em tempo de execução com base nas classes em uso pelo aplicativo.
O PermGen foi substituído pelo Metaspace desde o lançamento do Java 8.
Os parâmetros PermSize e MaxPermSize serão ignorados agora
Artigo de tutorial sobre fonte de imagem e 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:
fonte
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 um certo número de coleções da geração jovem, além de alguns objetos grandes que podem ser alocados diretamente na geração antiga. A geração permanente mantém objetos que a JVM acha conveniente gerenciar o coletor de lixo, como objetos que descrevem classes e métodos, bem como as próprias classes e métodos.
fonte
A memória no SunHotSpot JVM está organizada em três gerações: geração jovem, geração antiga e geração permanente.
FYI: A geração permanente não é considerada parte do heap Java.
Como as três gerações interagem / se relacionam? Objetos (exceto os grandes) são primeiramente alocados à geração jovem. Se um objeto permanecer vivo depois de x não. dos ciclos de coleta de lixo, ele é promovido para o antigo / tenured gen. Portanto, podemos dizer que a geração jovem contém os objetos de vida curta, enquanto a geração antiga contém os objetos que têm uma vida longa. A geração permanente não interage com as outras duas gerações.
fonte