Eliminação do PermGen no JDK 8


Respostas:


358

Razões para ignorar esse argumento é que a geração permanente foi removida no HotSpot para JDK8 devido às seguintes desvantagens

  • Tamanho fixo na inicialização - difícil de ajustar.
  • Os tipos de ponto de acesso interno eram objetos Java: podiam ser movidos com GC completo, opaco, não fortemente tipado e difícil de depurar, com meta-metadados necessários.
  • Simplifique coleções completas: iteradores especiais para metadados para cada coletor
  • Desalocar dados de classe simultaneamente e não durante a pausa no GC
  • Habilite melhorias futuras limitadas pelo PermGen.

O espaço de Geração Permanente (PermGen) foi completamente removido e é substituído por um novo espaço chamado Metaspace. As consequências da remoção do PermGen são que, obviamente, os argumentos da JVM PermSize e MaxPermSize são ignorados e você nunca receberá um erro java.lang.OutOfMemoryError: PermGen.

Vantagens do MetaSpace

  • Aproveite a propriedade Java Language Specification: Classes e vida útil de metadados associados correspondem ao carregador de classes
  • Área de armazenamento por carregador - Metaspace
  • Somente alocação linear
  • Nenhuma recuperação individual (exceto RedefineClasses e falha no carregamento da classe)
  • Nenhuma varredura ou compactação em GC
  • Nenhuma realocação para objetos de metasspace

Ajuste do Metaspace

O tamanho máximo do metasspace pode ser definido usando o sinalizador -XX: MaxMetaspaceSize, e o padrão é ilimitado, o que significa que apenas a memória do sistema é o limite. O sinalizador de ajuste -XX: MetaspaceSize define o tamanho inicial do metasspace Se você não especificar esse sinalizador, o Metaspace será redimensionado dinamicamente, dependendo da demanda do aplicativo em tempo de execução.

A mudança permite outras otimizações e recursos no futuro

  • Compartilhamento de dados de classe de aplicativo
  • Otimizações de coleções jovens, descarregamento de classe G1
  • Reduções de tamanho de metadados e projetos internos de pegada da JVM

Há um desempenho aprimorado do GC também. Mais detalhes


29
Devo mencionar que cordas internados foram previamente armazenados no espaço PermGen, mas foram transferidos para o principal heap Java em Java 7.
gparyani

Obrigado pela explicação detalhada.
Pradeep

3
Um pouco de introdução gentil para o público em geral (quero dizer principalmente pessoas que não são Java, por exemplo, colegas devops que precisam lidar com a JVM) não prejudicaria esta resposta.
ulidtko

117

Esse é um dos novos recursos do Java 8, parte das JDK Enhancement Proposals 122 :

Remova a geração permanente da JVM do Hotspot e, portanto, a necessidade de ajustar o tamanho da geração permanente.

A lista de todos os JEPs que serão incluídos no Java 8 pode ser encontrada na página de marcos do JDK8 .


19

O espaço de geração permanente (PermGen) foi completamente removido e é substituído por um novo espaço chamado Metaspace. As consequências da remoção de PermGen são que, obviamente, os argumentos PermSize e MaxPermSize JVM são ignorados e você nunca receberá um java.lang.OutOfMemoryErrorerro: PermGen. O JDK 8 HotSpot JVM agora está usando memória nativa para a representação de metadados de classe e é chamado Metaspace. Leia mais >>


3
O HotSpot JVM agora está usando memória nativa para a representação dos metadados da classe. - e que memória o HotSpot JVM usou anteriormente? E qual é a exata 'memória nativa'?
Andrey M. Stepanov


12

O espaço PermGen é substituído pelo MetaSpace no Java 8. Os argumentos PermSize e MaxPermSize JVM são ignorados e um aviso é emitido se presente na inicialização.

A maioria das alocações para os metadados da classe agora está alocada na memória nativa. * As classes usadas para descrever os metadados da classe foram removidas.

A principal diferença entre o antigo PermGen e o novo MetaSpace é que você não precisa definir obrigatoriamente o limite superior do uso de memória. Você pode manter o limite de espaço do MetaSpace ilimitado. Portanto, quando o uso da memória aumentar, você não receberá o erro OutOfMemoryError. Em vez disso, a memória nativa reservada é aumentada para preencher completamente o aumento do uso da memória.

Você pode definir o limite máximo de espaço para o MetaSpace e, em seguida, ele lançará o espaço OutOfMemoryError: Metadata. Portanto, é importante definir esse limite com cautela, para evitar o desperdício de memória.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.