내 개발자와 저는 우리가 원하지 않는 응용 프로그램에서 객체를 가비지 수집하는 데 문제가 있습니다. 우리는 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
}
서블릿의 초기화 방법은 JMSFactory의 singlton 메소드를 호출, 새로운 세션이 JMSObject로 생성 된 _sessions 해시 맵과 새로운 MessageConsumer/MessageProducers에 배치하고 배치가 _jmsobjects 해시 맵의 해당 목록에 있습니다.
문제는 시스템이 실행 중일 때 목록의 JMSObject가 일정 시간 후 가비지 수집을 받는다는 것입니다 (때로는 몇 시간 후 다른 시간에 5 분이 소요됨). 며칠 동안 이것을 보았지만 아무 것도 찾을 수 없었습니다 JMSObject가 수집 된 garbarge의 이유. 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가되는 이유를 설명 할 수 있습니까? 그리고 왜 세션 해시 맵에서 세션을 얻지 못했을까요? 세션이 Javax 형식으로 작성되었으며 JMSObject는 우리가 작성한 것과 관련이 있습니까?
'JMSObject'가 가비지 수집을 할 때 목록의 크기를 그대로 유지하지만 시도 할 때'null'이 표시됩니까? –
@Jack Leow, Yes NullPointerException ... :-(( – beggs