Em toda linguagem de programação, a memória é um recurso vital e também escasso por natureza. Portanto, é essencial que a memória seja totalmente gerenciada, sem vazamentos. Neste artigo, vamos entender o que é o metaspace e como ele é diferente do permgen. 

Antes de entender o metaspace, vamos primeiro entender a estrutura da memória JVM. 

Estrutura da memória JVM : 
JVM define várias áreas de dados de tempo de execução que são usadas durante a execução de um programa. Algumas das áreas são criadas pela JVM, enquanto outras são criadas pelos encadeamentos usados ​​em um programa. No entanto, a área de memória criada pela JVM é destruída apenas quando a JVM é encerrada. As áreas de dados do encadeamento são criadas durante a instanciação e destruídas quando o encadeamento é encerrado. A estrutura da memória JVM é dividida em várias áreas de memória, como área de heap, área de pilha, área de método, registros de PC, etc. A imagem a seguir ilustra as diferentes áreas de memória em Java: 

Partes da área de memória JVM

Partes da área de memória JVM

Aqui, a área de heap é uma das áreas de memória mais importantes da JVM. Aqui, todos os objetos java são armazenados. O heap é criado quando a JVM é iniciada. A pilha é geralmente dividida em duas partes. Isso é: 
 

  1. Geração jovem (berçário): Todos os novos objetos são alocados nesta memória. Sempre que essa memória é preenchida, a coleta de lixo é executada. Isso é chamado de coleta de lixo secundária .
  2. Velha Geração: Todos os objetos de vida longa que sobreviveram a muitas rodadas de coleta de lixo secundária são armazenados nesta área. Sempre que essa memória é preenchida, a coleta de lixo é executada. Isso é chamado de coleta de lixo principal .

Além da memória heap, a JVM também contém outro tipo de memória que é chamada de Geração Permanente ou “PermGen”. 

Memória PermGen: Este é um espaço especial no heap java que é separado da memória principal, onde todo o conteúdo estático é armazenado nesta seção. Além disso, essa memória também armazena os metadados do aplicativo exigidos pela JVM. Metadados são dados usados ​​para descrever os dados. Aqui, a coleta de lixo também acontece como qualquer outra parte da memória. O conjunto de strings também fazia parte dessa memória antes do Java 7. A Área do Método é uma parte do espaço no PermGen e é usada para armazenar a estrutura da classe e o código para métodos e construtores. A maior desvantagem do PermGen é que ele contém um tamanho limitado que leva a um OutOfMemoryError. O tamanho padrão da memória PermGen é 64 MB na JVM de 32 bits e 82 MB na versão de 64 bits. Devido a isso, a JVM teve que alterar o tamanho dessa memória, executando frequentemente a coleta de lixo, que é uma operação cara. Java também permite alterar manualmente o tamanho da memória PermGen. No entanto, o espaço PermGen não pode ser feito para aumentar automaticamente. Portanto, é difícil ajustá-lo. Além disso, o coletor de lixo não é eficiente o suficiente para limpar a memória. 

Devido aos problemas acima, o PermGen foi completamente removido do Java 8. No lugar do PermGen, um novo recurso chamado Meta Space foi introduzido. MetaSpace cresce automaticamente por padrão. Aqui, a coleta de lixo é acionada automaticamente quando o uso de metadados da classe atinge seu tamanho de metaespaço máximo. 

A tabela a seguir descreve a diferença entre metaspace e PermGen: 

 

PermGenMetaSpace
Ele foi removido do java 8.Ele é apresentado no Java 8.
PermGen sempre tem um tamanho máximo fixo.Metaspace por padrão aumenta automaticamente seu tamanho dependendo do sistema operacional subjacente.
Memória de heap Java contígua.Memória nativa (fornecida pelo sistema operacional subjacente).
Coleta de lixo ineficiente.Coleta de lixo eficiente.