vez - En Java se recoge la basura espacial de Generación Permanente?
porque es peligrosa la basura espacial (2)
He leído que el espacio Perm gen (o Generación permanente) no es basura. Sin embargo, en la recopilación de CMS puedo ver algunas clases descargando en mi registro de GC. Entonces, ¿se recolecta la basura perm gen durante la recolección completa o la recolección CMS?
El PermGen es basura recogida como las otras partes del montón.
Lo que hay que observar aquí es que PermGen contiene metadatos de las clases y los objetos, es decir, punteros en el resto del montón donde se asignan los objetos. PermGen también contiene cargadores de clases que deben destruirse manualmente al final de su uso, de lo contrario permanecen en la memoria y también mantienen referencias a sus objetos en el montón. El artículo "Presentar la generación permanente" de Jon Masamitsu en el sitio de blogs de Sun / Oracle podría ayudarlo.
En las JVM de generación actuales, permgen se recopila de verdad como otras partes del montón. La página visualgc indica que se recopila junto con la generación anterior.
En JVMs más antiguas esto aparentemente no siempre fue así. Por ejemplo, en Java 5, el recopilador de CMS aparentemente no recopiló permGen de manera predeterminada: podría habilitarlo con -XX:+CMSPermGenSweepingEnabled
. También recuerdo haber escuchado que algunas JVM realmente antiguas no implementaron la colección de permgen en absoluto, aunque no puedo encontrar una fuente confiable para esto ... ermm ... "factoid".
El otro punto es que mucha gente ha atribuido incorrectamente excepciones de "OutOfMemoryError: permgen" a permgen que no se recopilaron en absoluto. La realidad es diferente. La causa más común de estos OOME es un tipo insidioso de pérdida de almacenamiento que se manifiesta cuando carga un código en una JVM en ejecución. La fuga ocurre porque cuando una instancia de alguna clase anterior que ha sido reemplazada permanece accesible. Esto hace que la clase del objeto sea alcanzable, lo que hace que el cargador de clases de clase sea alcanzable, lo que hace que todas las clases antiguas sean accesibles, junto con sus objetos de código, sus literales de cadena y sus cuadros estáticos y estáticos. Muchos de estos objetos filtrados viven en el espacio permgen.
ACTUALIZAR
A partir de Java 8, permgen ya no existe: eliminación de PermGen en JDK 8