The dreaded permgen problem

Recentemente comecei a receber o erro “OutOfMemoryError - PermGen space”. Não se trata de um OutOfMemory error comum. Como o final da mensagem diz ocorre no “PermGen space”, que é o local onde os classloaders são criados.

Embora o problema seja mais comum nos applications servers, ele também pode ocorrer para aqueles que, como eu, usam linguagens de script. Buscando na net, achei dois ótimos artigos que falam a respeito do assunto, e recomendo a todos aqueles que trabalham com web, ou manipulam vários classloaders a leitura.

O primeiro deles, fala a respeito do problema, exemplifica como e porque ele ocorre, e também mostra porque ele é um problema sutil. O segundo, já dá uma luz sobre como identificar os possíveis pontos de falha no código.


Outros artigos legal sobre o assunto é:

Alguém aqui já passou pelo mesmo problema?

Uma dica, no lugar do aplicativo indicado pelos artigos, você pode usar o Netbeans profiler para identificar o Permgen. A interface é mais limpa, mais rápida e mais fácil de usar.

O TomCat tem muito disso, geralmente eu reinicio ele e pronto.

É melhor entender o problema do que contorna-lo, sem corrigir…

No caso, a minha aplicação é que faz as vias do TomCat, mas rodando scripts Groovy do meu usuário. :?

Eu ja tive isso com o Jboss4.0.5, o problema era com a lib do jboss-groups. Como temos contrato com a Red Hat aqui, nos enviaram uma lib corrigida.

Ótimo post!
Me ajudou bastante…

vlw!

Viny vc é o cara, nossa, como tava me batendo pra resolve isso, esses topicos ajudaram bastante, pra quem não conseguiu, seta a variavel de ambienta JAVA_OPTS, que o tomcat usa

por exemplo

JAVA_OPTS = -XX:MaxPermSize=256m

abraços a todos

[quote=Felagund]Viny vc é o cara, nossa, como tava me batendo pra resolve isso, esses topicos ajudaram bastante, pra quem não conseguiu, seta a variavel de ambienta JAVA_OPTS, que o tomcat usa

por exemplo

JAVA_OPTS = -XX:MaxPermSize=256m

abraços a todos[/quote]

Você não tá resolvendo o problema deste jeito, só adiando.

Concordo. É melhor usar o JHat, descrito nos artigos, identificar a origem do problema e então corrigi-la. Se a origem for alguma biblioteca de terceiros, abra um issue para a biblioteca, como fiz com o pessoal do Groovy.

[quote=Rafael Nunes][quote=Felagund]Viny vc é o cara, nossa, como tava me batendo pra resolve isso, esses topicos ajudaram bastante, pra quem não conseguiu, seta a variavel de ambienta JAVA_OPTS, que o tomcat usa

por exemplo

JAVA_OPTS = -XX:MaxPermSize=256m

abraços a todos[/quote]

Você não tá resolvendo o problema deste jeito, só adiando.[/quote]

Como assim?

tem como explicar melhor?

[quote=Felagund]

Como assim?

tem como explicar melhor?[/quote]
Setando esse parâmetro você só está aumentando a memória da PermGen.
Mas se você está com um leak de memória um dia esses 256 também vão estourar.

O que você precisa fazer é descobrir onde está o problema e resolve-lo.

[quote=Felagund]Viny vc é o cara, nossa, como tava me batendo pra resolve isso, esses topicos ajudaram bastante, pra quem não conseguiu, seta a variavel de ambienta JAVA_OPTS, que o tomcat usa

JAVA_OPTS = -XX:MaxPermSize=256m

Como assim?

tem como explicar melhor?[/quote]

Por exemplo se sua PermGen começava com 128m e você tinha problema depois de um dia da aplicação rodando, você dobrou o tamanho para 256m agora ela passara ter problema só depois de dois dias.
Ou seja, você deu mais espaço para a PermGen, agora ela vai demorar mais para encher, mas isso não vai impedir de ela continuar enchendo.

a sim, mas pro meu problema serve, é somente para um servidor de testes aqui, a aplicação roda em um Xeon Quad core :P, não tem esses problemas, ams estamos fazendo alguns testes e coloquei rodar num maquina um pouco pior, e não conseguia tirar alguns relatorios, isso já resolve o meu problema.

[]'s

[quote=Felagund]a sim, mas pro meu problema serve, é somente para um servidor de testes aqui, a aplicação roda em um Xeon Quad core :P, não tem esses problemas, ams estamos fazendo alguns testes e coloquei rodar num maquina um pouco pior, e não conseguia tirar alguns relatorios, isso já resolve o meu problema.
[/quote]

Ué, essa aplicação não irá para produção um dia??

[quote=ViniGodoy][quote=Felagund]a sim, mas pro meu problema serve, é somente para um servidor de testes aqui, a aplicação roda em um Xeon Quad core :P, não tem esses problemas, ams estamos fazendo alguns testes e coloquei rodar num maquina um pouco pior, e não conseguia tirar alguns relatorios, isso já resolve o meu problema.
[/quote]

Ué, essa aplicação não irá para produção um dia??[/quote]

ela já tah em produção, hehehe, o servidor de produção é o Xeon ele guenta, aqui tow rodando em um Athlon XP. :wink:

Fiz um sisteminha para monitoramento da memoria JVM a distância, em uma aplicação web. Para facilitar a instalação fiz na forma de uma jsp com scriplets mesmo. Jogue a jsp lá e acesse que os números com gráficos são exibidos. Foi útil para eu identificar momentos de pico no uso da heap. Coloquei uma opção de chamar o Garbage colector. Depois de chamá-lo dá para ver o quanto o heap diminui. Também dá para ver o permgen space chegando no final e tomar alguma decisão na madrugada antes de um erro estourar no usuário. Enquanto vc vai corrigindo o código usando um bom profile, este ‘profilezinho’ até que quebra um galho.

Espero que seja útil

pessoas, lendo sobre o problema e buscando a solução, achei a explicação do http://www.arquiteturajava.com.br/ sobre os NoSuchMethodError e o Classloaders Hell…

Ao final da explicação ele dá uma possível solução para o problema…

Entendi errado ou a dica é reiniciar a máquina toda ??? Porque da primeira vez que lí entendi que bastaria reiniciar o AS… :roll:

Abs []

Bom, o que eu faço sempre é: parar o TomCat >> Limpar e Construir >> Executar (Java Web)

[quote=ViniGodoy]Recentemente comecei a receber o erro “OutOfMemoryError - PermGen space”. Não se trata de um OutOfMemory error comum. Como o final da mensagem diz ocorre no “PermGen space”, que é o local onde os classloaders são criados.

Embora o problema seja mais comum nos applications servers, ele também pode ocorrer para aqueles que, como eu, usam linguagens de script. Buscando na net, achei dois ótimos artigos que falam a respeito do assunto, e recomendo a todos aqueles que trabalham com web, ou manipulam vários classloaders a leitura.

O primeiro deles, fala a respeito do problema, exemplifica como e porque ele ocorre, e também mostra porque ele é um problema sutil. O segundo, já dá uma luz sobre como identificar os possíveis pontos de falha no código.

http://blogs.sun.com/fkieviet/entry/classloader_leaks_the_dreaded_java
http://blogs.sun.com/fkieviet/entry/how_to_fix_the_dreaded

Outros artigos legal sobre o assunto é:

Alguém aqui já passou pelo mesmo problema?

Uma dica, no lugar do aplicativo indicado pelos artigos, você pode usar o Netbeans profiler para identificar o Permgen. A interface é mais limpa, mais rápida e mais fácil de usar.[/quote]

Ótimo post, me ajudou muito!