O que PermGen realmente significa?


122

Eu sei o que é PermGen, para que é usado, por que falha, como aumentá-lo etc.

O que eu não sei é o que PermGen realmente significa. Permanente ... Gen ... alguma coisa?

Alguém sabe o que PermGen realmente significa?


1
[Boa descrição] [1] do cara que sabe muito sobre os internos da GC. A propósito, há muitas informações úteis relacionadas ao GC em seu blog. [1]: blogs.oracle.com/jonthecollector/entry/…
Ivan

Respostas:


84

Geração Permanente. Os detalhes são obviamente específicos da implementação.

Resumidamente, ele contém os objetos Java associados a classes e cadeias internas. Na implementação do cliente da Sun com compartilhamento ativado, a classes.jsamemória é mapeada para formar os dados iniciais, com cerca de metade da leitura e metade da cópia na gravação.

Objetos Java que são apenas antigos são mantidos na Geração Tenured.


19
"No JDK 7, seqüências de caracteres
internas

30
E no JDK 8 não há geração permanente! É divertido ver essa resposta evoluir ao longo dos anos.
Brian Gordon

3
@BrianGordon está correto .. Para obter mais informações sobre isso: stackoverflow.com/a/22509753/4557537
Fadi

59

O PermGen é usado pela JVM para armazenar classes carregadas. Você pode aumentá-lo usando:

-XX:MaxPermSize=384m

se você estiver usando o Sun JVM ou OpenJDK.

Portanto, se você obtiver uma OutOfMemoryException: PermGen, precisará aumentar a PermGen ou poderá ter problemas com o carregador de classes.


6
Qual resposta foi aceita no momento em que você postou este comentário? A resposta atualmente aceita ( esta , de "Tom Hawtin - tackline") parece precisa para mim. Pode fazer sentido editar seu comentário para que não leve as pessoas a desconfiar da resposta aceita atualmente?
Jbyler #


8

Não corresponde realmente à pergunta original, mas pode ser que alguém a ache útil. PermGen é de fato uma área na memória em que Java costumava manter suas classes. Portanto, muitos de nós já encontramos o OOM no PermGen, se houver, por exemplo, muitas classes.

Desde o Java 8, a área de PermGen foi substituída pela área do MetaSpace, que é mais eficiente e ilimitada por padrão (ou mais precisamente - limitada pela quantidade de memória nativa, dependendo da jvm de 32 ou 64 bits e da disponibilidade da memória virtual do SO). No entanto, é possível ajustá-lo de algumas maneiras, especificando, por exemplo, um limite máximo para a área. Você pode encontrar informações mais úteis nesta postagem do blog .




3

Se bem me lembro, o gen significa geração, como em um coletor de lixo geracional (que trata objetos mais jovens de maneira diferente da meia-idade e objetos "permanentes"). O princípio da localidade sugere que os objetos criados recentemente serão eliminados primeiro.


1

Permgen significa Geração Permanente. É uma das áreas de memória da JVM. Faz parte do Heap com tamanho fixo usando um sinalizador chamado MaxPermSize.

Por que o nome "PermGen"?

Este permgen foi nomeado nos primeiros dias de Java. A rede de Permgen mantém todos os metadados das classes carregadas. Mas o problema é que, quando uma classe é carregada, ela permanece na JVM até o encerramento da JVM. Então, o nome permgen é optar por isso. Mais tarde, porém, o carregamento dinâmico de classes entrou em cena, mas o nome não foi alterado. Mas com o Java 8 , eles abordaram esse problema também. Agora, o permagen foi renomeado como MetaSpace com tamanho de memória dinâmica.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.