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 .