У нас с разработчиками возникает проблема с мусором, собираемым в нашем приложении, когда мы этого не хотим. Мы используем Java с Weblogic 10g3. Мы программируем одноэлементный шаблон для обработки всех наших соединений JMS.
Участвуют два класса:
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
}
Метод init сервлетов вызывает метод JMSFactory singlton, любые новые сеансы помещаются в хеш-карту _sessions, а новые MessageConsumer / MessageProducers создаются как JMSObject и помещаются в хеш-карту _jmsobjects в соответствующем списке.
Проблема в том, что когда система запускает объекты JMSObject в списке, они собирают мусор через некоторое время (иногда через 5 минут, иногда через несколько часов). Мы смотрели на это в течение нескольких дней, но не смогли найти причину. для объектов JMSO, подлежащих сбору. Поскольку у JMSFactory есть ссылка на них, зачем gc уничтожает их?
В конце мы исправили это, изменив классы следующим образом (без изменения интерфейсов методов):
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
}
Пока что при тестировании JMSObjects не получают gc'ed. Работает уже 2 дня.
Может кто-нибудь объяснить, почему косвенная ссылка вызывает получение объекта JMSObject? И почему сеансы в Hessmap _sessions не получают gc'ed? Имеет ли это какое-либо отношение к тому факту, что сеансы построены в типах Javax, а JMSObject - это то, что мы написали?