Mes développeurs et moi avons un problème avec les objets qui sont collectés dans notre application quand nous ne voulons pas qu'ils le soient. Nous utilisons Java avec Weblogic 10g3. Nous programmons un modèle singleton pour gérer toutes nos connexions JMS.Pourquoi cela est-il collecté
Il y a deux classes concernées:
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
}
La méthode d'initialisation des servlets appelle la méthode singlton JMSFactory, toutes les nouvelles sessions sont placées dans les _sessions hashmap et nouveaux MessageConsumer/MessageProducers sont créés comme JMSObject et placé dans le hash_jmsobjects, dans la liste appropriée. Le problème est que lorsque le système est en cours d'exécution, les JMSObjects de la liste récupèrent les ordures après un certain temps (parfois 5 minutes plus tard, après quelques heures). Nous avons regardé cela pendant quelques jours mais nous n'avons trouvé aucun raison pour laquelle les JMSObjects sont collectés. Puisque le JMSFactory a une référence à eux, pourquoi le gc les détruirait-il?
En fin de compte nous avons fixé en changeant les classes comme suit (sans changer les interfaces de méthode):
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
}
Jusqu'à présent, pour tester les JMSObjects ne sont pas gc'ed. Il a fonctionné pendant 2 jours. Est-ce que quelqu'un peut expliquer pourquoi la référence indirecte provoque l'exécution de la commande JMSObject? Et pourquoi les Sessions dans le _sessions Hashmap n'etaient pas gc'ed? Cela a-t-il quelque chose à voir avec le fait que les Sessions sont construites dans des types Javax et que JMSObject est quelque chose que nous avons écrit?
Quand le 'JMSObject's obtient des ordures rassemblées, je le prends la taille de la liste reste la même, mais vous obtenez' null's quand vous essayez et le lisez? –
@Jack Leow, Oui NullPointerException ... :-( – beggs