Por "liberado" quiero decir que no hay referencias para el cargador de clases restante.¿Cuándo se llama a finalize en singletons cuando se lanza un cargador de clases?
Nos encontramos con un problema en el que una aplicación Java EE que se redistribuye con frecuencia consume espacio permgen. El análisis muestra que un singleton en la aplicación Java EE ha pasado las referencias a los objetos de la aplicación-cargador de clases fuera de la aplicación (en violación de las reglas de Java EE) y no las borra cuando la aplicación no se implementa.
Suponiendo que no quedan otras referencias al singleton o al objeto de clase, ¿se llamará a finalize() de singleton cuando se libere el cargador de clase de su clase? Me gustaría borrar las referencias deshonestas allí. ¿O estoy en un catch-22 donde finalizar no se llamará hasta que el cargador de clases en sí mismo pueda ser recogido basura, y por lo tanto nunca será llamado debido a las referencias externas deshonestas?
La cuestión principal aquí es quizás:
¿Un objeto de la clase será recogido de basura, en este caso en su cargador de clases no puede ser todavía? Esto puede depender de la especificación del comportamiento del cargador de clases, o puede depender de la implementación.
Referencias (¡el otro tipo! ;-)) serían apreciadas, pero no son necesarias.
Si pasa referencias de cargadores de clases considere el uso de WeakReference (s) y WeakHashMap en lugar de referencias fuertes (regulares). – Stefan