Como o pool de memory java é dividido?

Atualmente estou monitorando um aplicativo Java com o jconsole. A guia de memory permite escolher entre:

Heap Memory Usage Non-Heap Memory Usage Memory Pool “Eden Space” Memory Pool “Survivor Space” Memory Pool “Tenured Gen” Memory Pool “Code Cache” Memory Pool “Perm Gen” 

Qual a diferença entre eles ?

    Memória heap

    A memory heap é a área de dados de tempo de execução a partir da qual a VM Java aloca memory para todas as instâncias de classs e matrizes. O heap pode ser de tamanho fixo ou variável. O coletor de lixo é um sistema de gerenciamento de memory automático que recupera a memory heap para objects.

    • Eden Space : O pool do qual a memory é inicialmente alocada para a maioria dos objects.

    • Survivor Space : O pool contendo objects que sobreviveram à garbage collection do espaço Eden.

    • Geração Tenured ou Old Gen : O pool contendo objects que existiram por algum tempo no espaço do sobrevivente.

    Memória não heap

    A memory não heap inclui uma área de método compartilhada entre todos os encadeamentos e a memory necessária para o processamento interno ou a otimização para a VM Java. Ele armazena estruturas por class, como um pool constante de tempo de execução, dados de campo e método e o código para methods e construtores. A área do método é logicamente parte do heap, mas, dependendo da implementação, uma VM Java pode não coletar ou compactar o lixo. Como a memory heap, a área do método pode ser de tamanho fixo ou variável. A memory para a área do método não precisa ser contígua.

    • Geração Permanente : 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 : O HotSpot Java VM também inclui um cache de código, contendo memory usada para compilation e armazenamento de código nativo.

    Aqui está uma documentação sobre como usar o Jconsole .

    A nova palavra-chave aloca memory no heap Java. O heap é o pool principal de memory, acessível a todo o aplicativo. Se não houver memory suficiente disponível para alocar para esse object, a JVM tentará recuperar alguma memory do heap com uma garbage collection. Se ainda não conseguir obter memory suficiente, um OutOfMemoryError será lançado e a JVM será encerrada.

    O heap é dividido em várias seções diferentes, chamadas gerações. À medida que os objects sobrevivem a mais coletas de lixo, eles são promovidos em diferentes gerações. As gerações mais velhas não são coletadas como lixo com frequência. Como esses objects já provaram ser mais duradouros, eles são menos propensos a serem coletados com o lixo.

    Quando objects são construídos pela primeira vez, eles são alocados no Eden Space. Se eles sobreviverem a uma garbage collection, eles serão promovidos para o Survivor Space, e se eles viverem tempo suficiente lá, eles serão alocados para a Tenured Generation. Essa geração é coletada com muito menos frequência.

    Há também uma quarta geração, chamada Geração Permanente ou PermGen. Os objects que residem aqui não são elegíveis para garbage collection e geralmente contêm um estado imutável necessário para a execução da JVM, como definições de class e o conjunto constante de Cadeia. Observe que o espaço PermGen está planejado para ser removido do Java 8 e será substituído por um novo espaço chamado Metaspace, que será mantido na memory nativa. referência: http://www.programcreek.com/2013/04/jvm-run-time-data-areas/

    insira a descrição da imagem aqui insira a descrição da imagem aqui

    Com o Java8, a região non heap não contém mais PermGen, mas o Metaspace, que é uma grande mudança no Java8, deve eliminar erros de falta de memory com o java, pois o tamanho do metaspace pode ser aumentado dependendo do espaço requerido pelo jvm para dados de class.

    Java Heap Memory faz parte da memory alocada para a JVM pelo sistema operacional.

    Objetos residem em uma área chamada heap. O heap é criado quando a JVM é iniciada e pode aumentar ou diminuir em tamanho enquanto o aplicativo é executado. Quando o heap fica cheio, o lixo é coletado.

    insira a descrição da imagem aqui

    Você pode encontrar mais detalhes sobre o Espaço Eden, o Espaço Survivor, o Espaço Tenured e a Geração Permanente abaixo da pergunta SE:

    Geração Young, Tenured e Perm

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

    Quanto às suas dúvidas:

    1. Espaço Eden, Espaço Survivor, Espaço Tenured fazem parte da memory heap
    2. Metaspace e Code Cache fazem parte da memory não-heap.

    Codecache: O Java Virtual Machine (JVM) gera código nativo e o armazena em uma área de memory chamada codecache. A JVM gera código nativo por vários motivos, incluindo para o loop de intérprete gerado dinamicamente, stubs do Java Native Interface (JNI) e para methods Java que são compilados em código nativo pelo compilador just-in-time (JIT). O JIT é de longe o maior usuário do codecache.