ti-enxame.com

O que causa Permgen OutOfMemoryError no JBoss?

Qual é a causa subjacente de um Permgen OutofmemoryError em JBoss?

Eu estou executando o JBoss como 4.2.2 no meu ambiente de desenvolvimento, e isso ocorre após reimplementar meu aplicativo web um grande número de vezes.

Blog do Colete Christian Hansen Dá opções JVM que ajudam muito , mas não resolvem completamente o problema:

-XX:+UseConcMarkSweepGC
-XX:+CMSPermGenSweepingEnabled
-XX:+CMSClassUnloadingEnabled
-XX:MaxPermSize=128m
8
Peter Hilton

Como já mencionado, você provavelmente está experimentando carregadores de classe vazando. Por algum motivo, suas aulas não estão sendo descarregadas. Isso pode acontecer por dois motivos

  • Objetos das referidas classes ainda existem no heap, objetos sempre referência à sua classe, ou
  • O carregador de aula é referenciado em algum lugar, por qualquer motivo, carregadores de aula referem suas classes para não carregá-las duas vezes

Não há nenhuma solução para esse problema. Uma ferramenta útil para ajudá-lo a encontrar a causa raiz é a ferramenta de analisador de memória Eclipse , que você pode se inscrever em um despejo de heap da sua JVM (você pode habilitar lixões de heap em Ooms com a -xx: + heapdumponoutofmemoryError opção). Talvez comece a procurar por objetos java.lang.class do seu aplicativo da web para ver por que eles estão sendo mantidos vivos. Infelizmente, a Permgen não é normalmente parte de um despejo de heap JVM, então você só pode tentar encontrar artefatos correlacionados no resto do heap (objetos de classe não são armazenados em Permgen se não estiver enganado, apenas o código de byte real é, por favor me corrija se eu estiver errado embora).

Hth.

Editar:
Dave Cheney sugere em um comentário que java.lang.class-objetos são de fato parte do Permgen, e não incluídos em um lixo normal de heap de hotspot. A menos que você tenha uma JVM que escreve esta informação no despejo de heap, você precisará de uma abordagem diferente. Você ainda pode procurar por instâncias de seus objetos, mas se você está vazando aulas/classes de classe (eles infelizmente implicam um ao outro), parece que você precisa procurar outros sinais (objetos de meta de dados do JBoss, etc).

5
falstro

A causa subjacente é referências a classes que foram descartadas vazando fora de seu carloader, impedindo que a JVM descarregue essas classes do Gen do Perm. Essas bandeiras que você usa podem fazer com que a JVM expulte agressivamente classes que são descartáveis, mas não resolverá o problema subjacente.

Há uma explicação complexa boa e abeitosa aqui

2
Dave Cheney

A causa do erro OutOfMemory Permgen é a reimplementação do aplicativo. A causa subjacente é vazada objetos de classe em Permgen das redesplainds.

Claro, a solução é reiniciar a JVM após um certo número de reimplemplos.

Este é um problema muito difícil para resolver totalmente, embora com alguma sleehing, muitas vezes você pode fazer grandes melhorias. Aqui está onde você começa: Quando seu aplicativo da web é interrompido, certifique-se de que:

  • todos threads que você começou parou
  • ALL ThreadPools que você iniciou está desligado
  • ALL Referências estáticas que você pode lançar são liberadas

Estas são algumas das coisas que podem fazer com que um objeto de classe seja preso no Permgen.

Além disso, observe que nem todos os JVMs (ou todas as versões do JVMS) serão objetos de classe GC em Permgen. Se você estiver executando uma JVM ou uma versão de uma JVM que não seja objetos de classe GC no Permgen, sua única opção é reiniciar a JVM após um determinado número de reimplementos. Isso provavelmente não se aplica a você, dadas as opções JVM que você menciona.

1
Eddie