我的開發人員和我有一個問題,當我們不希望他們成爲垃圾收集在我們的應用程序中的對象。我們正在使用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
}
的servlet的init方法調用JMSFactory singlton方法,任何新的會話被放置在_sessions HashMap和新的MessageConsumer /的MessageProducer被創建爲JMSObject並放置在_jmsobjects Hashmap中,在適當的List中。
問題是,當系統運行時,列表中的JMSObjects會在一段時間後收集垃圾(有時在幾個小時後的其他時間5分鐘內)。我們查看了幾天,但找不到任何JMSObjects被收集的理由。由於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被gc'ed?以及爲什麼在_sessions Hashmap中的會話沒有得到gc'ed?它與Sessions是否構建在Javax類型中並且JMSObject是我們寫的東西有什麼關係?
當JMSObject被垃圾回收時,我認爲它的大小保持不變,但是當你嘗試讀取它時會得到`null`s? – 2009-07-14 03:18:38
@Jack Leow,是NullPointerException ... :-( – beggs 2009-07-14 04:33:06