スタンドアロン環境でSpring3.1を使用しています。
(この問題はSpringに関連する必要はありません。スタンドアロン環境でも同じように動作します。)
トピックからメッセージを受信するリスナーを実装しました。メッセージレートは非常に高いです(約20/30 m / sについて話します)。
一部のメッセージは、他のメッセージよりも処理時間がかかる場合があります。
リスナーは同じインスタンスで動作します。つまり、1つのメッセージの処理時間が長すぎると、パフォーマンスにかなりの影響を及ぼします。
同じリスナーインスタンスを使用する代わりに、独自のオブジェクトプールを作成することを考えましたが、エグゼキューター(java.util.concurrent.Executors)を見つけました。
したがって、受信したメッセージごとに異なるスレッドが割り当てられます。これにより、リスナーインスタンスがメッセージを自由に並列処理できるようになります。
private ExecutorService threadPool = Executors.newFixedThreadPool(100);
@Override
public void onMessage(final Message msg)
{
Runnable t = new Runnable()
{
public void run()
{
onSessionMessage(msg);
log.trace("AbstractSessionBean, received messge");
}
};
threadPool.execute(t);
}
これでパフォーマンスの問題は解決したようです。しかし、jconsoleでアプリケーションを監視した後、私たちは今、巨大なメモリリークに直面しています。
ヒープメモリの使用量は、時間の経過とともに大幅に増加しています。
そこで、FixedThreadPoolのサイズ番号を少し使って「再生」しようとしました。まだ膨大なメモリ使用量があります:
どうすればこれを解決できますか?私の重要な問題を解決するための他のアイデアはありますか?
ヒープダンプを実行した後、2つの問題の疑いがありました。
ありがとう、レイ。