MetaSpace em Java 8 com exemplos
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:
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 é:
- 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 .
- 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:
PermGen | MetaSpace |
---|---|
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. |
As postagens do blog Acervo Lima te ajudaram? Nos ajude a manter o blog no ar!
Faça uma doação para manter o blog funcionando.
70% das doações são no valor de R$ 5,00...
Diógenes Lima da Silva