Como já foi mencionado, provavelmente você está tendo vazamentos de carregadores de classes. Por alguma razão, suas aulas não estão sendo descarregadas. Isso pode acontecer por dois motivos
- Objetos dessas classes ainda existem no heap, os objetos sempre fazem referência a sua classe ou
- O carregador de classes é referenciado em algum lugar, por qualquer motivo, os carregadores de classes fazem referência a suas classes para não carregá-las duas vezes
Não há solução completa para esse problema. Uma ferramenta útil para ajudá-lo a encontrar a causa raiz é a Ferramenta Analisador de Memória do Eclipse , que você pode aplicar para um dump de heap de sua JVM (é possível ativar dumps de heap nos 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 localizar artefatos correlatos no restante do heap (Objetos de classe não são armazenados no PermGen se não me engano, apenas o código de byte real é, por favor me corrija se eu estiver errado).
HTH.
Editar:
Dave Cheney sugere em um comentário que java.lang.Class-objects são de fato parte do PermGen, e não estão incluídos em um dump de heap hotspot normal. A menos que você tenha uma JVM que grava essas informações no despejo de heap, precisará de uma abordagem diferente. Você ainda pode procurar instâncias de seus objetos, mas se você estiver vazando classes / carregadores de classes (ambos infelizmente implicam um ao outro), parece que você precisa procurar por outros sinais (objetos de metadados do JBoss, etc).