Terminologia do heap Java: gerações jovens, antigas e permanentes?

Eu estou tentando entender como os conceitos de gerações jovens , antigas e permanentes na terminologia do heap Java, e mais especificamente as 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?

    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 class e dados relacionados. No Java 6 e versões anteriores, as sequências internas também eram armazenadas na geração permanente. No Java 7, as cadeias internas são armazenadas no heap do object principal.

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

    Eu gosto das descrições dadas para cada espaço no guia da Oracle no JConsole :

    Para o HotSpot Java VM, os conjuntos de memory para garbage collection serial são os seguintes.

    • Eden Space (heap): O pool do qual a memory é inicialmente alocada para a maioria dos objects.
    • Survivor Space (heap): O pool que contém objects que sobreviveram à garbage collection do espaço Eden.
    • Tenured Generation (heap): O pool que contém objects que existiram por algum tempo no espaço do sobrevivente.
    • Geração Permanente (não-heap): O conjunto contendo todos os dados refletivos da própria máquina virtual, como objects de class e método. Com Java VMs que usam o compartilhamento de dados de class, essa geração é dividida em áreas somente leitura e leitura / gravação.
    • Cache de Código (não-heap): O HotSpot Java VM também inclui um cache de código, contendo memory que é usada para compilation e armazenamento de código nativo.

    Java usa garbage collection geracional. Isso significa que, se você tiver um object foo (que é uma instância de alguma class), quanto mais events de garbage collection ele sobreviver (se ainda houver referências a ele), mais ele será promovido. Começa na geração jovem (que é dividida em múltiplos espaços – Éden e Sobrevivente) e terminaria na geração atual se sobrevivesse por tempo suficiente.

    O heap é dividido em gerações jovens e antigas da seguinte forma:

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

    • Eden Space : Quando o object é criado usando a nova memory de palavra-chave alocada nesse espaço.
    • Survivor Space : Este é o pool que contém objects que sobreviveram após a garbage collection do espaço Eden.

    Old Generation : Este pool é basicamente conter espaço tenured e virtual (reservado) e estará segurando os objects que sobreviveram após a garbage collection da Young Generation.

    • Espaço Tenured: Esse pool de memory contém objects que sobreviveram após várias coletas de lixo, o que sobreviveu após a garbage collection do espaço Survivor.

    Geração Permanente: Esse conjunto de memorys, como o nome também diz, contém informações permanentes de metadados e descritores de class, de forma que o espaço PermGen sempre seja reservado para classs e aquelas que estejam vinculadas às classs, por exemplo, membros estáticos.

    Atualização Java8: PermGen é substituído pelo Metaspace, que é muito semelhante.
    A principal diferença é que o Metaspace redimensiona dinamicamente, ou seja, pode expandir em tempo de execução.
    Espaço do Java Metaspace: ilimitado (padrão)

    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 memory que será usada para compilation e armazenamento de código nativo.

    insira a descrição da imagem aqui

    Cortesia

    Qual é a geração jovem?

    A Young Generation é onde todos os novos objects são alocados e envelhecidos. Quando a geração jovem se enche, isso causa uma pequena garbage collection. Uma geração jovem cheia de objects mortos é coletada muito rapidamente. Alguns objects sobreviventes envelhecem e acabam se mudando para a velha geração.

    Qual é a velha geração?

    A Old Generation é usada para armazenar objects que sobrevivem por muito tempo. Normalmente, um limite é definido para o object de geração jovem e, quando essa idade é atingida, o object é movido para a geração antiga. Eventualmente, a velha geração precisa ser coletada. Este evento é chamado de uma grande garbage collection

    Qual é a geração permanente?

    A geração permanente contém metadados exigidos pela JVM para descrever as classs e os methods usados ​​no aplicativo. A geração permanente é preenchida pela JVM em tempo de execução com base nas classs 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

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

    insira a descrição da imagem aqui

    Fonte da imagem e artigo sobre o tutorial do oracle technetwork: http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

    O processo geral de garbage collection ” no artigo acima explica as interações entre eles com muitos diagramas.

    Dê uma olhada no diagrama de resumo:

    insira a descrição da imagem aqui

    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 objects é inicialmente alocada na geração jovem. A geração antiga contém objects que sobreviveram a algumas collections de geração jovem, bem como alguns objects grandes que podem ser alocados diretamente na geração antiga. A geração permanente contém objects que a JVM considera convenientes para gerenciar o coletor de lixo, como objects que descrevem classs e methods, bem como as próprias classs e methods.

    Este artigo é uma pesquisa muito boa sobre coletores de lixo. Ele define os conceitos básicos e a terminologia da garbage collection e inclui muitos desenhos explicativos. É uma “leitura obrigatória” para qualquer pessoa interessada em como funciona a alocação automática de memory; a leitura facilitará muito a leitura e compreensão dos vários documentos que outros apontaram.

    (O que falta a esse documento é qualquer informação sobre pesquisas pós-1993 sobre coletores de lixo, especialmente sobre o negócio de sistemas com vários núcleos. Ainda assim, você tem que aprender a andar antes de aprender a correr.)

    Supondo que você esteja falando sobre o Sun JDK / OpenJDK, consulte a página no site do OpenJDK em Gerenciamento de Armazenamento . Existem alguns links para mais informações na parte inferior.

    Embora seja sobre o ajuste eu não posso resistir a recomendar este documento, dê uma olhada no capítulo 3 e vá em profundidade, se quiser.

    Memória no SunHotSpot A JVM é organizada em três gerações: geração jovem, geração antiga e geração permanente.

    • Geração Jovem: os objects recém-criados são alocados para o jovem gen.
    • Geração antiga: se o novo object solicitar um espaço de heap maior, ele será alocado diretamente na antiga geração. Também objects que sobreviveram a alguns ciclos de GC são promovidos para o antigo gen, ou seja, objects de longa vida abrigam-se na antiga geração.
    • Geração Permanente: A geração permanente contém objects que a JVM considera convenientes para gerenciar o coletor de lixo, como objects que descrevem classs e methods, bem como as próprias classs e methods.

    FYI: A geração permanente não é considerada parte do heap Java.

    Como as três gerações interagem / se relacionam entre si? Objetos (exceto os grandes) são alocados primeiro à geração jovem. Se um object permanecer vivo depois de x não. de ciclos de garbage collection é promovido para o gen velho / tenured. Portanto, podemos dizer que o jovem gen contém os objects de vida curta, enquanto o gen antigo contém os objects que têm uma vida longa. O gerador permanente não interage com as outras duas gerações.