Permgen vs Metaspace em Java

Permgen vs Metaspace em Java

1. Introdução

Neste tutorial rápido,we’re going to examine the differences between the PermGen and Metaspace memory regions no ambiente Java.

É importante ter em mente que, a partir do Java 8, o Metaspace substitui o PermGen - trazendo algumas mudanças substanciais.

2. PermGen

PermGen (Permanent Generation) is a special heap space separated from the main memory heap.

A JVM controla os metadados de classe carregados no PermGen. Além disso, a JVM armazena todo o conteúdo estático nesta seção de memória. Isso inclui todos os métodos estáticos, variáveis ​​primitivas e referências aos objetos estáticos.

Além disso,it contains data about bytecode, names and JIT information. Antes do Java 7, o String Pool também fazia parte dessa memória. As desvantagens do tamanho fixo do pool estão listadas em nossowrite-up.

O tamanho máximo de memória padrão para a JVM de 32 bits é de 64 MB e 82 MB para a versão de 64 bits.

No entanto, podemos alterar o tamanho padrão com as opções da JVM:

  • -XX:PermSize=[size] é o tamanho inicial ou mínimo do espaço PermGen

  • -XX:MaxPermSize=[size] é o tamanho máximo

Mais importante ainda, a Oracle removeu completamente esse espaço de memória na versão JDK 8.

With its limited memory size, PermGen is involved in generating the famous OutOfMemoryError. Simplificando, osclass loaders não são coletados como lixo corretamente e, como resultado, geraram um vazamento de memória.

Portanto, recebemos ummemory space error; isso acontece principalmente no ambiente de desenvolvimento durante a criação de novos carregadores de classes.

3. Metaspace

Simplificando, Metaspace é um novo espaço de memória - a partir da versão Java 8; it has replaced the older PermGen memory space. A diferença mais significativa é como ele lida com a alocação de memória.

Como resultado,this native memory region grows automatically by default. Aqui também temos novos sinalizadores para ajustar a memória:

  • MetaspaceSizeeMaxMetaspaceSize – podemos definir os limites superiores do Metaspace.

  • MinMetaspaceFreeRatio –  é a porcentagem mínima de capacidade livre de metadados da classe apósgarbage collection

  • MaxMetaspaceFreeRatio – é a porcentagem máxima de capacidade de metadados da classe livre após uma coleta de lixo para evitar uma redução na quantidade de espaço

Além disso, o processo de coleta de lixo também obtém alguns benefícios com essa alteração. O coletor de lixo agora aciona automaticamente a limpeza das classes mortas quando o uso de metadados da classe atinge seu tamanho máximo de metasspace.

Portanto,with this improvement, JVM reduces the chance to get the OutOfMemory error.

Apesar de todas essas melhorias, ainda precisamos monitorar etune up o metaspace para evitar vazamentos de memória.

4. Sumário

Esta rápida descrição apresenta uma breve descrição das regiões de memória PermGen e Metaspace. Além disso, explicamos as principais diferenças entre cada um deles.

O PermGen ainda existe com o JDK 7 e versões anteriores, mas o Metaspace oferece um uso de memória mais flexível e confiável para nossos aplicativos.