Wir erstellen mehrere untergeordnete Klassenladeprogramme, die in mehrere Subanwendungen in einen Java-Anwendungscontainer geladen werden können. Wenn sich der Klassenpfad eines bestimmten Klassenladeprogramms geändert hat (d. H., Dass Gefäße hinzugefügt, gelöscht, aktualisiert wurden), wird der alte Klassenladeprogramm weggeworfen (nicht referenziert) und ein neuer Klassenladeprogramm für den neuen Klassenpfad von Gefäßen erstellt.Wann und wie ist ein Java Classloader für die Garbage Collection markiert?
Nachdem der Klassenpfad aktualisiert und die Hot-Bereitstellung ausgelöst wurde, wurde ein Heap-Dump ausgeführt. Der Heapspeicherauszug (mit Memory Analyzer) zeigt an, dass die alten Klassenladeprogramme nicht als Garbage Collected erfasst wurden. Bestimmte Klassen im übergeordneten Klassenlader speicherten die alten Klassenlader. Die folgenden Dinge wurden aufgerufen, diese Caches zu löschen:
java.lang.ResourceBundle.clearCache(classLoader);
org.apache.commons.logging.LogFactory.release(classLoader);
java.beans.Introspector.flushCaches();
Auch nach dem oben genannten Caches zu leeren, wurden die alten Klassenlader noch nicht Müll gesammelt werden. Die verbleibenden Verweise auf die Klassenladeprogramm unter anderem die folgenden:
- die durch den Klassenlader geladenen Klassen
- java.lang.Package die durch die Klassenlader erstellt selbst
- java.lang.ProtectionDomain durch den Klassenlader erstellt selbst
Alle oben genannten sind zirkuläre Referenzen innerhalb der Klassenlader, die eine Garbage Collection auslösen sollte. Ich bin mir nicht sicher, warum es nicht ist. Weiß jemand, warum die alten Klassenlader auch bei den Zirkelverweisen immer noch nicht Müll sind?
Welche JVM verwenden Sie (genaue Version)? Verwenden Sie JVM-Optionen, die sich auf das Laden von Klassen auswirken können? Benutzt du irgendwelche Sachen von Suns eigenen Implementierungen? Verändert die Anwendung den Byte-Code? ... Welche Umgebung könnte das Laden von Klassen beeinträchtigen? – cafebabe
Nicht im Zusammenhang mit Ihrer Hauptfrage, aber haben Sie etwas wie OSGi in Betracht gezogen, anstatt Ihr eigenes Framework zu erstellen, das Hot Deployment unterstützt? – SteveD
@bfoo In unseren Tests verwenden wir Java 6. Keine JVM-Optionen.Wir verwenden nicht Suns Impl von irgendetwas im einfachsten Fall. Keine Byte-Code-Manipulation. – onejigtwojig