Como já mencionado, você provavelmente está enfrentando vazamentos nos carregadores de classes. Por algum motivo, suas aulas não estão sendo descarregadas. Isso pode acontecer por duas razões
- Os objetos dessas classes ainda existem na pilha, os objetos sempre referenciam sua classe ou
- O carregador de classes é referenciado em algum lugar, por qualquer motivo, os carregadores de classes referenciam suas classes para não carregá-las duas vezes
Não existe uma solução abrangente para esse problema. Uma ferramenta útil para ajudá-lo a encontrar a causa raiz é a Eclipse Memory Analyzer Tool , que você pode aplicar a um dump de heap da sua JVM (você pode ativar dumps de heap em OOMs com a opção -XX: + HeapDumpOnOutOfMemoryError). Talvez comece a procurar objetos java.lang.Class no seu aplicativo da web para ver por que eles estão sendo mantidos vivos. Infelizmente, o PermGen normalmente não faz parte de um dump de heap da JVM, portanto, você só pode tentar encontrar artefatos correlatos no restante do heap (objetos de classe não são armazenados no PermGen se não estiver enganado, apenas o código de byte real é, por favor me corrija se eu estiver errado).
HTH.
Edit:
Dave Cheney sugere em um comentário que java.lang.Class-objects são realmente parte do PermGen e não estão incluídos em um despejo de heap de hotspot normal. A menos que você tenha uma JVM que grave essas informações no dump de heap, precisará de uma abordagem diferente. Você ainda pode procurar instâncias de seus objetos, mas se estiver vazando classes / carregadores de classes (ambos infelizmente se implicam), parece que você precisa procurar outros sinais (objetos de metadados do JBoss, etc.).
A causa subjacente são as referências às classes que foram descartadas vazando fora do carregador de classes, impedindo a JVM de descarregar essas classes do perm perm. Esses sinalizadores usados podem fazer com que a JVM limpe agressivamente classes que não podem ser carregadas, mas não resolverá o problema subjacente.
Há uma explicação boa e complexa aqui
fonte
A causa do erro PermGen OutOfMemory é que o aplicativo é reimplementado. A causa subjacente é o vazamento de objetos de classe no PermGen das reimplementações.
Obviamente, a solução alternativa é reiniciar a JVM após um certo número de reimplementações.
Esse é um problema muito difícil de resolver totalmente, embora com algumas investigações você possa fazer grandes melhorias. Aqui é onde você começa: Quando o aplicativo da Web for interrompido, verifique se:
Estas são algumas das coisas que podem fazer com que um objeto Class fique preso no PermGen.
Além disso, observe que nem todas as JVMs (ou todas as versões das JVMs) terão objetos da classe GC no PermGen. Se você estiver executando uma JVM ou uma versão de uma JVM que não terá objetos da Classe GC no PermGen, sua única opção será reiniciar a JVM após um certo número de reimplementações. Isso provavelmente não se aplica a você, dadas as opções de JVM que você menciona.
fonte