为什么这是垃圾收集

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是我们写的东西吗?

mat*_*t b 5

既然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)