Qual é a diferença entre PermGen e Metaspace?

118

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 spacenão pode mais ser acionado e o parâmetro VM MaxPermSizeé ignorado.

Kao
fonte
primeiro resultado do Google: infoq.com/articles/Java-PERMGEN-Removed
the8472
@ the8472 Sim, mas este (e muitos outros) resultados do Google descrevem apenas o mecanismo Metaspace, sem mencionar nada sobre as diferenças exatas entre ele e o PermGen.
Kao

Respostas:

137

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.Classinstâ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 .

Mattias Jiderhamn
fonte
17
Nem Permgen, nem Metaspace contêm instâncias da classe Class. Eles apenas mantêm metainformações sobre as classes carregadas. Instâncias da classe Class são mantidas em heap regular, como instâncias de outras classes.
Média de Joe de
Bela comparação. Obrigado
Sandeep
1
A propósito, OTOH significa "Por outro lado"
sofs1
43

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 Metadataocupado não é mais contíguo ao Java heap. O metadataagora mudou para a memória nativa para uma área conhecida como Metaspace.

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 errorse pode acabar extravasando para o espaço de troca.

A remoção de PermGennã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

Ankur Singhal
fonte
6
Em vez de MaxPermGen você tem MaxMetaspaceSize, então não há razão para que ele use mais, ou menos memória ou você tenha menos controle.
Peter Lawrey
2
de que memória estamos falando aqui? Memória RAM ou memória HDD.
Jantar em
1
@Dinesh RAM (memória interna)
Aditya Gupta
10

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

Chandrasekaran
fonte