2010-03-31 12 views
5

Ich verwende ein benutzerdefiniertes Klassenladeprogramm, das URLClassLoader erweitert. Ich lade einige Klassen in meinen benutzerdefinierten Klassenlader und führe einige Aufgaben aus. Sobald die Aufgabe abgeschlossen ist, möchte ich den Klassenlader entsorgen. Ich habe das versucht, indem ich den Verweis auf null gesetzt habe.Entsorgen eines Klassenladeprogramms

Aber das sammelt nicht den Klassenlader.

Gibt es einen Weg, der helfen kann, was ich erreichen möchte?

+0

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

+0

nicht die gleiche Frage _quite_, dieser ist über die Klassenlader, anstatt die geladenen Klassen Entladen. –

+1

Mein erster Ratschlag wäre zu überprüfen, was Ihre Klassen in Ihrem Klassenlader nicht verschrottet. Erstellen Sie einen Dump und analysieren Sie die Abhängigkeiten zu den Klassen, die Ihr Klassenlader besitzt. –

Antwort

2

Von der ClassLoader doc: Every Class object contains a reference to the ClassLoader that defined it. Dies verhindert, dass Ihr Lader gesammelt wird. Sie müssten auch alle Verweise auf die Klassen und Instanzen dieser Klassen aufheben.

3

Grundsätzlich, wie @invariant bereits darauf hingewiesen hat, sollte das Dereferenzieren aller Klassen, die vom spezifischen Klassenlader geladen werden, den Klassenlader zu einem Sammelobjekt machen. Es gibt jedoch (mindestens) eine Ausnahme: Wenn eine Klasse serialisiert wird, wird diese Klasse (und somit ihr Klassenlader) intern durch ObjectStreamClass referenziert, was eine Urklasse ist und daher niemals Müll gesammelt wird. In diesem Fall kann der Classloader daher nicht als Garbage Collected erfasst werden, bis die gesamte JVM beendet ist.

Siehe die vollständige Erklärung here, im Abschnitt "Probleme im Zusammenhang mit Garbage Collection und Serialisierung".

0

Solange eine der von diesem Klassenlader geladenen Klassen referenziert wird, wird der Klassenlader nicht als Garbage-Collection behandelt. Der Classloader wird also entfernt, wenn: alle direkten Referenzen auf den Classloader nulled sind, alle Referenzen auf Klassen, die von diesem Classloader geladen wurden und auf Instanzen dieser Klassen. Dann kann es auf den nächsten Lauf des Müllsammlers geworfen werden.

1

Der ClassLoader wird als Garbage Collection behandelt, nachdem keine Klassen mehr durch den ClassLoader erstellt wurden. Es gibt einen alten Fehler (4950148), der damit zusammenhängt, dass es keine Möglichkeit gibt, einen ClassLoader explizit zu entfernen, was beispielsweise Probleme mit der Dateisperrung verursacht.

Dies ist jetzt fixed in JDK 7, die eine URLClassLoader.close() Methode hinzugefügt.