Até o Java 7 havia uma área na memória da JVM chamada PermGen , onde a JVM costumava manter suas classes. No Java 8 ele foi removido e substituído por uma área chamada Metaspace .
Quais são as diferenças mais importantes entre PermGen e Metaspace?
A única diferença que sei é que java.lang.OutOfMemoryError: PermGen space
não pode mais ser acionado e o parâmetro VM MaxPermSize
é ignorado.
Respostas:
A principal diferença da perspectiva do usuário - que eu acho que a resposta anterior não enfatiza o suficiente - é que o Metaspace por padrão aumenta automaticamente seu tamanho (até o que o sistema operacional subjacente fornece), enquanto o PermGen sempre tem um tamanho máximo fixo. Você pode definir um máximo fixo para Metaspace com parâmetros JVM, mas não pode fazer o aumento automático de PermGen.
Em grande medida, é apenas uma mudança de nome. Na época em que o PermGen foi introduzido, não havia Java EE ou classe dinâmica (des) carregando, portanto, uma vez que uma classe era carregada, ela ficava presa na memória até que a JVM fosse desligada - portanto, Geração Permanente . Hoje em dia, as classes podem ser carregadas e descarregadas durante a vida útil do JVM, portanto, o Metaspace faz mais sentido para a área onde os metadados são mantidos.
Ambos contêm as
java.lang.Class
instâncias e ambos sofrem de vazamentos ClassLoader . A única diferença é que com as configurações padrão do Metaspace, leva mais tempo até você notar os sintomas (uma vez que aumenta automaticamente o máximo que pode), ou seja, você simplesmente empurra o problema para longe sem resolvê-lo. OTOH Eu imagino que o efeito de ficar sem memória do SO pode ser mais grave do que apenas ficar sem JVM PermGen, então não tenho certeza se isso é uma grande melhoria.Esteja você usando uma JVM com PermGen ou com Metaspace, se estiver fazendo o descarregamento de classe dinâmico, você deve tomar medidas contra vazamentos do carregador de classe, por exemplo, usando minha biblioteca ClassLoader Leak Prevention .
fonte
Tchau, tchau PermGen, olá, Metaspace
PermGen foi completamente removido.
Coleta de lixo do Metaspace - A coleta de lixo das classes mortas e carregadores de classe é acionada assim que o uso de metadados da classe atinge o
MaxMetaspaceSize
.O espaço
Metadata
ocupado não é mais contíguo aoJava heap
. Ometadata
agora mudou para a memória nativa para uma área conhecida comoMetaspace
.Em palavras simples ,
Como os metadados da classe são alocados fora da memória nativa, o espaço máximo disponível é a memória total do sistema disponível. Assim, você não encontrará mais
OOM errors
e pode acabar extravasando para o espaço de troca.A remoção de
PermGen
não significa que os problemas de vazamento do carregador de classes acabaram. Então, sim, você ainda terá que monitorar seu consumo e fazer um planejamento adequado, pois um vazamento acabaria consumindo toda a sua memória nativa.Alguns outros artigos, com análise: Link1 , Link2 e este
fonte
Em suma, o tamanho do Metaspace aumenta automaticamente na memória nativa, conforme necessário para carregar os metadados da classe, se não for restrito com
-XX:MaxMetaspaceSize
fonte