2010-03-31 9 views
5

Estoy usando un cargador de clases personalizado que extiende URLClassLoader. Cargué algunas clases en mi cargador de clases personalizado y realizo algunas tareas. Una vez que la tarea esté completa, quiero deshacerme del cargador de clases. Intenté hacer eso estableciendo la referencia a nulo.desechando un cargador de clase

Pero esto no es basura para recoger el cargador de clases.

¿Hay alguna manera de ayudar a lo que quiero lograr?

+0

Ver http://stackoverflow.com/questions/148681/unloading-classes-in-java/148707#148707 –

+0

No es la misma pregunta, esta es sobre la descarga del cargador de clases en lugar de las clases cargadas. –

+1

Mi primer consejo sería verificar qué hace que tus clases dentro de tu cargador de clases no sean descartables. Haga un volcado y analice las dependencias de las clases que tiene su cargador de clases. –

Respuesta

2

Desde ClassLoader doc: Every Class object contains a reference to the ClassLoader that defined it. Esto impide que se recopile su cargador. Tendría que anular todas las referencias a las clases e instancias de esas clases también.

3

Básicamente, como @invariant ya se ha señalado, la eliminación de referencias de todas las clases cargadas por el cargador de clases específico debería hacer que la basura del cargador de clases se pueda coleccionar. Sin embargo, hay (al menos) una excepción: si una clase está serializada, esa clase (y por lo tanto su cargador de clases) se mantiene internamente referenciada por ObjectStreamClass, que es una clase primordial y, por lo tanto, nunca se recolecta basura. Entonces, en este caso, el cargador de clases tampoco puede ser recolectado como basura hasta que termine la JVM completa.

Consulte la explicación completa here, en la sección "Problemas relacionados con la recogida y serialización de basura".

0

Siempre que se haga referencia a cualquiera de las clases cargadas por este cargador de clases, el cargador de clases no se recogerá. Por lo tanto, el cargador de clases se eliminará si: se anulan todas las referencias directas al cargador de clases, todas las referencias a las clases cargadas por este cargador de clases y las instancias de estas clases. Luego se puede descargar en la siguiente ejecución del recolector de basura.

1

El cargador de clases se recolectará como basura después de que no haya más instancias de clases creadas por el cargador de clases. Hay un error anterior (4950148) relacionado con que no hay forma de eliminar explícitamente un ClassLoader, lo que causa problemas, por ejemplo, con el bloqueo de archivos.

Esto ahora ha sido fixed in JDK 7 que agrega un método URLClassLoader.close().

Cuestiones relacionadas