beg*_*ggs 1 java garbage-collection weblogic jms java-ee
我和我的开发人员遇到了一个问题,当我们不想要它们时,我们的应用程序中的对象被垃圾收集.我们在Weblogic 10g3中使用Java.我们正在编写单例模式来处理所有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
}
Run Code Online (Sandbox Code Playgroud)
Servlet的init方法调用JMSFactory单元方法,任何新的Sessions都放在_sessions Hashmap中,新的MessageConsumer/MessageProducers作为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
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,在测试中JMSObjects并没有被gc'ed.它已经运行了2天.
有人可以解释为什么间接引用导致JMSObject获取gc'ed?为什么_sessions Hashmap中的Sessions没有获得gc'ed?它与Sessions是用Javax类型构建的事实有什么关系,而JMSObject是我们写的东西吗?
既然JMSFactory引用了它们,为什么gc会破坏它们呢?
那么,此时仍有任何对象仍然引用JMSFactory吗?
典型的单例模式保持对静态成员中单例对象的引用:
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
//constructor...
}
public static Singleton getInstance() { return instance; }
}
Run Code Online (Sandbox Code Playgroud)
这不是你所遵循的模式吗?从您在帖子中提供的代码中无法判断,因为您遗漏了实际的单例代码...
(顺便说一句,使用Singletons这样的事情听起来会引起痛苦,除了难以测试之外.参见Singletons Are Pathlogical Liars)
| 归档时间: |
|
| 查看次数: |
719 次 |
| 最近记录: |