De acuerdo con la publicación del blog La lista más completa de opciones -XX para Java JVM , determina si la descarga de clases está habilitada bajo el recolector de basura CMS. El valor por defecto es false
. Hay otra opción llamada ClassUnloading
que es true
por defecto que (presumiblemente) afecta a los otros recolectores de basura.
La idea es que si el GC detecta que una clase cargada previamente ya no se usa en ninguna parte de la JVM, puede recuperar la memoria utilizada para contener el bytecode de las clases y / o el código nativo.
Configurar CMSClassUnloadingEnabled podría ayudarlo con su problema de permgen si actualmente está utilizando el recopilador de CMS . Pero lo más probable es que no esté utilizando el CMS o que tenga una pérdida de memoria genuina relacionada con el cargador de clases. En el último caso, su clase nunca aparecerá en el GC como no utilizada ... y, por lo tanto, nunca se descargará.
Aaron Digulla dice "las clases son para siempre". Esto no es estrictamente cierto, incluso en el mundo puramente Java. De hecho, la vida útil de una clase está vinculada a su cargador de clases. Entonces, si puede organizar que un cargador de clases sea basura recolectada (y eso no siempre es algo fácil de hacer), las clases que cargó también serán recolectadas.
De hecho, esto es lo que sucede cuando realizas una nueva implementación de una aplicación web. (O al menos, eso es lo que debería suceder, si puede evitar los problemas que conducen a una fuga de almacenamiento de permgen).
CMSClassUnloadingEnabled
tener algún impacto,UseConcMarkSweepGC
también se debe configurar