Meine Entwickler und ich haben ein Problem mit Objekten, die in unserer Anwendung als Müll gesammelt werden, wenn wir sie nicht haben wollen. Wir verwenden Java mit Weblogic 10g3. Wir programmieren ein Singleton-Muster, um alle unsere JMS-Verbindungen zu handhaben.Warum wird dieser Müll gesammelt?
Es gibt zwei Klassen beteiligt:
public class JMSObject {
...
private MessageProducer _producer;
private MessageConsumer _consumer;
...
// standard get/set procs... etc.
}
public class JMSFactory {
...
// Hashmap sessions with key == ConnectionFactory Name
Hashmap<String, List<Session>> _sessions;
// Hashmap of JMSObjects with key == ConnectionFactory Name + JMS Queue Name
Hashmap<String, List<JMSObject>> _jmsobjects;
...
// standard get/set & necessary sington functions
}
Die init-Methode der Servlets ruft die JMSFactory singlton Methode, alle neuen Sitzungen werden in den _sessions platziert HashMap und neue Message/MessageProducers werden als JMSObject erstellt und platziert in der _jmsobjects-Hashmap in der entsprechenden Liste.
Das Problem ist, dass wenn das System läuft die JMSObjects in der Liste Müll nach einiger Zeit (manchmal in 5 Minuten andere Zeiten nach ein paar Stunden) Grund dafür, dass die JMSObjects gesammelt werden. Da die JMSFactory einen Verweis auf sie hat, warum würde der GC sie zerstören?
Am Ende haben wir es durch eine Änderung der Klassen wie folgt festgelegt (ohne Schnittstellen-Methode zu ändern):
public class JMSObject {
...
private List<MessageProducer> _producers;
private List<MessageConsumer> _consumers;
...
// standard get/set procs... etc.
}
public class JMSFactory {
...
// Hashmap sessions with key == ConnectionFactory Name
Hashmap<String, List<Session>> _sessions;
// Hashmap of JMSObjects with key == ConnectionFactory Name + JMS Queue Name
private Hashmap<String JMSObject> _jmsobjects;
...
// standard get/set & necessary sington functions
}
Bisher ist die JMSObjects bei der Prüfung nicht gc'ed werden. Es läuft seit 2 Tagen.
Kann jemand erklären, warum der indirekte Verweis das JMSObject veranlasst, gc'ed zu werden? Und warum wurden die Sessions in der _sessions Hashmap nicht gc'ed? Hat es etwas damit zu tun, dass die Sessions in Javax-Typen eingebaut sind und das JMSObject etwas ist, was wir geschrieben haben?
Wenn die 'JMSObject's Müll gesammelt werden, nehme ich es die Größe der Liste bleibt gleich, aber Sie erhalten' null ', wenn Sie versuchen, es zu lesen? –
@Jack Leow, Ja NullPointerException ... :-( – beggs