De acordo com a postagem do blog A lista mais completa de opções -XX para Java JVM , determina se o descarregamento de classe está ativado no coletor de lixo do CMS. O padrão é false
. Há outra opção chamada ClassUnloading
que é true
por padrão que (presumivelmente) afeta os outros coletores de lixo.
A idéia é que, se o GC detectar que uma classe carregada anteriormente não é mais usada em nenhum lugar da JVM, poderá recuperar a memória usada para manter as classes pelo bytecode e / ou código nativo.
Definir CMSClassUnloadingEnabled pode ajudar com seu problema de permgen se você estiver usando o coletor CMS no momento . Mas as chances são de que você não esteja usando o CMS ou que tenha um vazamento de memória genuíno relacionado ao carregador de classes. Neste último caso, sua classe nunca parecerá estar sendo usada pelo GC ... e, portanto, nunca será descarregada.
Aaron Digulla diz que "as aulas são para sempre". Isso não é estritamente verdade, mesmo no mundo puramente Java. De fato, a vida útil de uma classe está ligada ao seu carregador de classes. Portanto, se você puder organizar que um carregador de classes seja coletado como lixo (e isso nem sempre é fácil), as classes que ele carregou também serão coletadas.
De fato, é isso que acontece quando você faz uma reimplementação a quente de um aplicativo da web. (Ou pelo menos, é isso que deve acontecer, se você puder evitar os problemas que levam a um vazamento de armazenamento permanente).
CMSClassUnloadingEnabled
ter qualquer impacto,UseConcMarkSweepGC
também deve ser definido