開発者と私は、アプリケーションで不要なオブジェクトがガベージ コレクションされるという問題を抱えています。Weblogic 10g3 で Java を使用しています。すべての JMS 接続を処理するシングルトン パターンをプログラミングしています。
関連する 2 つのクラスがあります。
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 シングルトン メソッドを呼び出し、新しいセッションが _sessions ハッシュマップに配置され、新しい MessageConsumer/MessageProducers が JMSObject として作成され、_jmsobjects ハッシュマップの適切なリストに配置されます。
問題は、システムがリスト内の 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 されていません。2日間実行されています。
誰かが間接参照によって JMSObject が gc される理由を説明できますか? そして、_sessions ハッシュマップのセッションが GC されなかったのはなぜですか? セッションが Javax 型で構築されており、JMSObject が私たちが作成したものであるという事実と何か関係がありますか?