Eliminação de PermGen no JDK 8

Eu instalei o JDK 8 e tente 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 as razões de ignorar esse argumento?

   

Razões de ignorar esses argumentos é que a geração permanente foi removida do HotSpot for JDK8 por causa das seguintes desvantagens

  • Tamanho fixo na boot – difícil de ajustar.
  • Os tipos de ponto de access interno eram objects Java: podiam ser movidos com GC completo, opacos, não muito tipificados e difíceis de depurar, precisavam de meta-metadados.
  • Simplifique as collections completas: iteradores especiais para metadados para cada coletor
  • Deseja desalocar dados de class simultaneamente e não durante a pausa do GC
  • Ativar melhorias futuras que foram limitadas pelo PermGen.

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

Vantagens do MetaSpace

  • Tire proveito da propriedade Java Language Specification: Classes e vidas de metadados associados correspondem ao carregador de class
  • Área de armazenamento por carregador – Metaspace
  • Apenas alocação linear
  • Nenhuma reclamação individual (exceto para RedefineClasses e falha de carregamento de class)
  • Nenhuma varredura ou compactação de GC
  • Nenhuma realocação para objects do metaspace

Ajuste Metaspace

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

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

  • Compartilhamento de dados da class de aplicativo
  • Otimizações de coleção jovem, descarga de class G1
  • Reduções de tamanho de metadados e projetos internos de pegada da JVM

Há melhor desempenho do GC também. Mais detalhes

Este é um dos novos resources do Java 8, parte do JDK Enhancement Proposals 122 :

Remova a geração permanente da JVM do Hotspot e, assim, 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 .

O espaço Geração Permanente (PermGen) foi completamente removido e foi substituído por um novo espaço chamado Metaspace. As conseqüências da remoção do PermGen é que obviamente os argumentos PermSize e MaxPermSize JVM são ignorados e você nunca obterá um java.lang.OutOfMemoryError : Erro no PermGen. A JVM do HotSpot do JDK 8 agora está usando memory nativa para a representação de metadados de class e é chamada Metaspace. Leia mais >>

Porque o espaço PermGen foi removido. O gerenciamento de memory mudou um pouco.

http://java.dzone.com/articles/java-8-permgen-metaspace

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 estiver presente na boot.

A maioria das alocações para os metadados da class agora está alocada fora da memory nativa. * As classs usadas para descrever os metadados da class foram removidas.

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

Você pode definir o limite máximo de espaço para o MetaSpace e, em seguida, ele lançará OutOfMemoryError: Espaço de metadados. Assim, é importante definir esse limite com caucanvas, para que possamos evitar o desperdício de memory.

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