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.
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
[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]
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.
[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]
[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.
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.
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:
[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.
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]