スタンドアロン環境で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つの問題の疑いがありました。

ありがとう、レイ。