Pergunta

Meu aplicativo mostra o tamanho do tamanho da 'geração antiga'/'geração titular', e quando isso atinge o limite máximo de 'antigo gen', de repente o tamanho do permgen aumenta. Aqui estão meus sizings de geração:

-Xmx1200m -Xms1200m -Xmn450m -XX:MaxPermSize=600m -XX:+UseParallelGC

Isso ocorre em Fedora de 32 bits, então não pode ter uma pilha maior do que isso.

O aplicativo não está fazendo nenhuma carga de classe sofisticada, embora esteja usando o Spring IOC e o Hibernate, o Spring App-Context.xml define cerca de 1000 feijões.

Este aplicativo começa com 175 MB Permgen, que aumenta constantemente para ~ 250 MB em poucas horas, permanece assim até que a geração titular atinja ~ 780 MB, depois o Permgen salta para ~ 500 MB enquanto a geração antiga cai para ~ 500 MB.

Isso me obriga a reiniciar o aplicativo diariamente e me dá um verdadeiro assustador de erro de impressão iminente. Quaisquer idéias seriam muito úteis.

Obrigado Gala101

13/maio: Alguém poderia jogar a luz sobre o que acontece quando 'Old Gen' é coletado de lixo?
A JVM coloca coleções de 'Old Gen' em Permgen?
Meu pico permgen ocorre apenas quando a coleta ocorre de 'Old Gen', também diminui o tamanho do tamanho do Oldgen corresponde ao tamanho do permgen.
PS: Eu não faço nenhuma implantação ao vivo/UNDEPLAPE, pois isso certamente consumirá o Permgen.
Abaixo está um spanshot atual da minha página de monitoramento: (a parte comprometida acabou de saltar de ~ 250 MB para 500 MB)

    PS Perm Gen
Type    Non-heap memory
Usage   init = 16777216(16384K) used = 254453736(248489K) committed = 504954880(493120K) max = 629145600(614400K)
Peak Usage  init = 16777216(16384K) used = 254453736(248489K) committed = 504954880(493120K) max = 629145600(614400K)
Collection Usage    init = 16777216(16384K) used = 252421536(246505K) committed = 504954880(493120K) max = 629145600(614400K)
Foi útil?

Solução

Eu seguiria o conselho de Leonm para analisar o que leva tanta memória. Aposto que você tem algum tipo de vazamento de memória desagradável.

Você diz que não faz nenhuma carga de classe sofisticada, mas o Hibernate gera algumas classes rapidamente para você. Você usa alguns recursos da AOP (por exemplo, do módulo Spring AOP?).

Basicamente, se você estiver ficando sem espaço permgen, parece que seu aplicativo continua produzindo novas classes (porque são as aulas que são armazenadas no Permgen).

Outras dicas

Use o JMAP para fazer um despejo de memória antes de reiniciar seu servidor e analisar com Eclipse Mat

O Permgen se vaza se você continuar implantando/não implantando aplicativos no AppServer.

Verifique este link para obter mais explicação como essa não é culpa do AppServer.

http://blogs.oracle.com/fkieviet/entry/classloader_leaks_the_dreaded_java

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top