run メソッドを持つクラスがあり、そのクラスのメイン メソッドのタイマーは、次のコードでクラスを呼び出しています。
Timer timer = new Timer();
timer.scheduleAtFixedRate(new LegacySmsSender(), 0, 2*1000);
run メソッドで、ThreadExecutorPool を宣言します。
ThreadPoolExecutor packetProcessorThreadPool =
new ThreadPoolExecutor(4,
4,
Long.MAX_VALUE,
TimeUnit.DAYS,
new LinkedBlockingQueue<Runnable>(),
new MyThreadFactory("packetProcessorThreadPool")
);
私は4つのPacketProcessorを作成しnew PacketProcessor()
、 それらのリターンをリストにpacketProcessorThreadPool.submit
保持します。Future
次に、それらすべてがループで終了するのを待ちます。
for(Future<?> f:packetProcessorList)
{
System.out.println("before f.get() "+new Date());
f.get();
}
そして、これらの PacketProcessor クラスの run メソッド内で、ThreadPoolExecutor を宣言し、1 ~ 5000 の数のスレッドを作成して送信します (通常は 6 ~ 7 個のスレッドを作成します)。PacketProcessor の threadPoolExecutor コードは次のようになります。
ThreadPoolExecutor commonThreadPool =
new ThreadPoolExecutor(
20,
20,
Long.MAX_VALUE,
TimeUnit.DAYS,
new LinkedBlockingQueue<Runnable>(),
new MyThreadFactory("commonThreadPool"));
そして最後に、これを約20分間実行し、VisualVM、メモリ使用量、およびライブスレッド数が常に上昇していることを確認しました。何が問題ですか ?
注 : 詳細情報や質問については、遠慮なくお尋ねください。
ここにいくつかの情報を含むスクリーンショットがあります:
編集1:
270 MB のヒープ ダンプを取得しました。160MB の char[] が見つかりました。そして、1000〜2000千のクエリ文字列を見つけました。StringBuilder を使用してクエリ文字列を作成します。なぜGCされないのですか?