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.).