Según la publicación de blog The most complete list of -XX options for Java JVM, determina si la descarga de clase está habilitada en el recolector de elementos no utilizados de CMS. El valor predeterminado es false
. Hay otra opción llamada ClassUnloading
que es true
por defecto que (presumiblemente) afecta a los demás recolectores de basura.
La idea es que si el GC detecta que una clase previamente cargada ya no se usa en ninguna parte de la JVM, puede reclamar la memoria utilizada para contener el código de byte y/o código nativo de la clase.
Ajuste CMSClassUnloadingEnabled podría ayudarle con su problema PermGen si este momento está usando el colector CMS. Pero lo más probable es que no esté utilizando el CMS, o que tenga una pérdida de memoria relacionada con un cargador de clases genuino. En este último caso, su clase nunca aparecerá ante el GC para que no se use ... y por lo tanto nunca será descargada.
Aaron Digulla dice "las clases son para siempre". Esto no es estrictamente cierto, incluso en el mundo puramente Java. De hecho, la duración de una clase está ligada a su cargador de clases. Por lo tanto, si puede organizar que un cargador de clases sea basura (y eso no siempre es fácil de hacer), las clases que cargó también serán basura.
De hecho, esto es lo que ocurre cuando se realiza 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).)
Según http://stackoverflow.com/a/3720052/2541 para 'CMSClassUnloadingEnabled' tener cualquier impacto, 'UseConcMarkSweepGC' también debe establecerse –
No estoy seguro de cómo esto afecta la idea de usar UseConcatSweepGC, pero parece que recientemente se corrigió un error en CMSClassUnloadingEnabled. Se indica como corregido aquí: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=8000325 – BillR
Para idiomas como Groovy que definen dinámicamente las clases, ¿es una buena práctica habilitar esta bandera para limpiar periódicamente PermGen? –