開発者と私のアプリケーションでガベージコレクションされているオブジェクトに問題があります。 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メソッドは、新しいセッションがHashMapのと新しいのMessageConsumer /れるMessageProducersがJMSObjectとして作成され、配置されている_sessionsに配置され、JMSFactoryのsingltonメソッドを呼び出します_jmsobjectsハッシュマップの適切なリストに追加します。
問題があるのは、リスト内のJMSObjectsがガベージコレクションをしばらくしてから(時には数時間後に5分になることもある)数日間見ましたが、何も見つかりませんでしたJMSObjectsが収集された着信通知の理由。なぜJMSFactoryはそれらを参照しているのですか?我々は次のようにクラスを変更することによってそれを固定端で
(メソッド・インターフェースを変更せずに):
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になるのか説明できますか?そして、セッションハッシュマップのセッションがなぜgc'edされていないのですか?セッションはJavax型で構築されているという事実と関係があり、JMSObjectは私たちが書いたものですか?
'JMSObject'がガベージコレクションを取得すると、リストのサイズは同じになりますが、読み込んだときに' null'が返されます。 –
@Jack Leow、Yes NullPointerException ... :-(( – beggs