Eliminação do PermGen no JDK 8

229

Instalei o JDK 8 e estou tentando executar o Eclipse. Estou recebendo a seguinte mensagem de aviso:

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512m;
support was removed in 8.0 

Quais são os motivos para ignorar esta opção de VM?

Shamim Ahmmed
fonte
4
Você pode achar isso informativo: javaeesupportpatterns.blogspot.co.uk/2013/02/…
Andrew Martin

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

pardeep131085
fonte
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 .

assilias
fonte
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 >>

Dhrumil Shah
fonte
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
16

Porque o espaço PermGen foi removido. O gerenciamento de memória mudou um pouco.

java-8-permgen-metaspace

Sebastian Redl
fonte
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.

Shubham Pandey
fonte
9

A implementação da JVM da Oracle para Java 8 se livrou do modelo PermGen e o substituiu pelo Metaspace .

chrylis -autiouslyoptimistic-
fonte