O que é espaço permanente?

88

Enquanto aprendo sobre o perfil de memória java, vejo o termo "espaço de perm" além de "heap". Eu sei o que é a pilha - o que é espaço permanente?

skiphoppy
fonte
13
Java 8 removeu completamente este conceito e mudou-se para o Metaspace
pramodc84
2
Referência bem explicada aqui youtube.com/watch?v=PUUJ4rNpRhU
shareef

Respostas:

103

Significa geração permanente :

A geração permanente é especial porque contém metadados que descrevem classes de usuário (classes que não fazem parte da linguagem Java). Exemplos de tais metadados são objetos que descrevem classes e métodos e são armazenados na Geração Permanente. Aplicativos com grande base de código podem preencher rapidamente este segmento do heap que causará java.lang.OutOfMemoryError: PermGen não importa quão alto seu -Xmx e quanta memória você tenha na máquina.

Andrew Hare
fonte
Andrew, estou apenas curioso para saber qual poderia ser o tamanho do PerGen?
gks
Apenas curioso para saber se permgen é uma parte da memória heap (conforme declarado nesta resposta) ou está fora da pilha (conforme declarado nesta resposta - stackoverflow.com/a/31103100/3061686 ).
akki
26

Perm spaceé usado para manter informações para classes carregadas e alguns outros recursos avançados como String Pool(para testes de igualdade de strings altamente otimizados), que geralmente são criados por String.intern()métodos. À medida que sua aplicação (número de classes) crescerá, este espaço deve ser preenchido rapidamente, uma vez que a coleta de lixo neste espaço não é muito eficaz para limpar conforme necessário, você obterá rapidamente Sem memória: erro de espaço permanente. Depois disso, nenhum aplicativo será executado naquela máquina de forma eficaz, mesmo depois de ter uma enorme JVM vazia.

Antes de iniciar seu aplicativo, você deve java -XX:MaxPermSizese livrar deste erro.

DKSRathore
fonte
O pool de strings é alterado para o espaço de heap desde o java 7.
Caffeine Coder
20

Resposta simples (e simplificada): é onde o jvm armazena seus próprios dados de contabilidade, em vez de seus dados.

Matt
fonte
17

Perm Gen significa geração permanente, que contém as informações de metadados sobre as classes.

  1. Suponha que se você criar um nome de classe A, sua variável de instância será armazenada na memória heap e a classe A junto com carregadores de classe estáticos serão armazenados em geração permanente.
  2. Os coletores de lixo terão dificuldade em limpar ou liberar o espaço de memória armazenado na memória de geração permanente. Portanto, é sempre recomendável manter as configurações da memória permgen no limite aconselhável.
  3. JAVA8 introduziu o conceito chamado geração de meta-espaço, portanto, o permgen não é mais necessário quando você usa as versões 1.8 do jdk.
Praveen Kumar KS
fonte
5

O espaço permgen é a área do heap que contém todos os dados reflexivos da própria máquina virtual, como objetos de classe e método.

Jesse
fonte
3

Ele contém coisas como definições de classe, conjunto de strings, etc. Acho que você poderia chamá-lo de metadados.

usuario
fonte
3

O espaço Permgen é sempre conhecido como área de método. Quando o subsistema do carregador de classe carrega o arquivo de classe (código de byte) para a área de método (permGen). Ele contém todos os metadados da classe, por exemplo: nome totalmente qualificado da sua classe, nome totalmente qualificado da classe pai imediata, informações da variável, informações do construtor, informações do pool constante etc.

Amruta
fonte
2

O que existe sob PremGen: Área de Classe está sob a área PremGen. Os campos estáticos também são desenvolvidos no momento do carregamento da classe, portanto, também existem no PremGen. A área do Pool constante com todos os campos imutáveis ​​agrupados como String são mantidos aqui. Além disso, dados de classe carregados por carregadores de classes, matrizes de objetos e objetos internos usados ​​por jvm também estão localizados.

oi.nitish
fonte
1

PermGen Space significa alocação de memória para geração permanente. Todos os objetos imutáveis ​​Java estão nesta categoria, como os Stringque são criados com literais ou com String.intern()métodos e para carregar as classes na memória. O Espaço PermGen acelera nossa pesquisa de igualdade de strings.

Spark-Beginner
fonte
1
  • JVM tem uma representação interna de objetos Java e essas representações internas são armazenadas no heap (na geração jovem ou na geração titular).
  • JVM também tem uma representação interna das classes Java e aquelas são armazenadas na geração permanente

insira a descrição da imagem aqui

Roopesh Payyanath
fonte