こんにちは。現在javaによるバッチ処理で、一定時間ごとにメールを受信してその内容を解析してDBに登録する、と言うプログラムを組んでいます。
メールの受信は、POPアカウントごとにサーバに接続して受信すると言う仕様にしなくてはなりません。このため、POPアカウントごとにThreadを生成して並行処理で複数のPOPサーバに同時に接続してメールを受信する、と言う流れにします。
ここで問題なのが、タイトルのとおり、OutOfMemorryエラーが発生してしまうことなんです。おそらくThreadの生成の仕方に問題があるのではないか、と言う考えにいたりましたが、解決策がわからないので、ここで質問させていただきます。以下が、そのコードを簡略化したものです。以下の一連の処理が一定時間ごとに行われる想定です。
~中略~
// POPアカウント情報をリストへ格納
List popAccountList = getPopData();
for(int i = 0; i < popAccountList.size(); i++){
PopAccount data = popAccountList.get(i);
// PopAccountの一意のIdをスレッドにセットして生成
PopGetThread thread = new PopGetThread(data.popData);
// スレッドの中で、メール受信処理が行われる。
thread.start();
try{
// 1つのスレッドが処理を終えるまで待つ
thread.join();
}catch(InterruptedException ie){
}
}
~続く~
こういう具合で、この処理を一定時間ごと(分単位)に、繰り返します。Runtime.getRuntime.totalMemory()などで、確認すると、周期処理が進むごとに、徐々に使用メモリが増えていってしまい、やがてOutOfMemoryになります。Threadがメモリを食いつぶしていることが原因ではないかと思うのですが、このような場合、どう解決すればいいのでしょうか。どなたかご教授いただけませんでしょうか・・お願いします。
No.2ベストアンサー
- 回答日時:
こんにちは。
>えっと、これは各POPアカウントのすべてのメール受信の処理が完全に終わったら、
>次の処理へ移ると言う仕様でして、すべてのthreadの終了を判断できるように、
>ということで入れた処理なんですが、これは不要ですか??
これでは、スレッドが同時実行されないので、マルチスレッドにしている意味がないのでは?
同時実行する気がないのなら普通にシングルスレッドで実行すればよいですし、同時実行するのなら、ThreadPoolExecutorとかを使って、スレッド数をコントロールした方がいいんじゃないでしょうか?
PecoPlusさん、ありがとうございます。ThreadPoolExecutorというものがあったんですね・・。初めて知りました。ご教授ありがとうございます。とりあえずそれを試してみようと思います。
No.1
- 回答日時:
たぶんPopGetThreadにメモリリーク(オブジェクトの未解放)があるんでしょうね。
もひとつ、forループにおけるthread.join()の意味がわかりませんが…。要らないのでは?
この回答への補足
_ranco_さんありがとうございます。
たぶんPopGetThreadにメモリリーク(オブジェクトの未解放)があるんでしょうね。>>
それは、PopGetThread自身の未解放という意味でしょうか。それとも、PopGetThreadがパラメータとして持つ何か、と言う意味でしょうか。
forループにおけるthread.join()>>
えっと、これは各POPアカウントのすべてのメール受信の処理が完全に終わったら、次の処理へ移ると言う仕様でして、すべてのthreadの終了を判断できるように、ということで入れた処理なんですが、これは不要ですか??
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- 消費者問題・詐欺 駐車場調べ隊というサイトで、会員登録してましたが 無料期間で退会するためサイトで申し込みしたところ 2 2023/06/03 23:22
- Wi-Fi・無線LAN PCWi-Fiの設定方法がわからなくて困っています。 4 2022/12/28 18:30
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- 情報処理技術者・Microsoft認定資格 応用情報処理技術者試験のシステム利用率の計算について 2 2022/03/28 07:43
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- iPhone(アイフォーン) iPhoneのデータ処理の仕組みに詳しい方に質問です。下の知恵袋とAppleコミュニティで、「ボイス 2 2022/07/16 00:04
- BTOパソコン PCの選び方 6 2022/09/11 00:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
tryの終了
-
Javaでのデバッグコード削除
-
WPF C#でF10のイベント取得方法...
-
印刷プレビュー表示したい .NET
-
素数判定を再帰処理で
-
ExcelVBA で文字列の特定の文字...
-
JavaScriptからJAVAクラスを呼...
-
onBlurとonFocusの処理順序につ...
-
表示待ち時間に「処理中...」の...
-
重い処理を行っているとGIFアニ...
-
巡回バッファを使用した生産者-...
-
MediaPlayerコントロールのイベ...
-
switch文の中に、throws new Ex...
-
ラジオボタンの選択判定
-
C#で別スレッドの終了を知りたい
-
C# PostMessage BeginInvok
-
再度、スレッドが実行中かどう...
-
アコーディオンメニューをアン...
-
Tomcat高負荷時の設定について
-
Javaアプリケーション実行の返...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
tryの終了
-
Tomcat高負荷時の設定について
-
onBlurとonFocusの処理順序につ...
-
Javaでのデバッグコード削除
-
ラジオボタンの選択判定
-
WPF C#でF10のイベント取得方法...
-
doGetとdoPostの違い
-
SwingUtilities.invokeLater(ne...
-
アコーディオンメニューをアン...
-
数値の定数を付ける時
-
switch文の中に、throws new Ex...
-
JAVAからJAVASCRIPT関数を呼び出し
-
再度、スレッドが実行中かどう...
-
ラベルの表示までが異常に遅い...
-
JavaScriptからJAVAクラスを呼...
-
javaのプログラムが止まる
-
Javaプログラムからポップアッ...
-
C#で別スレッドの終了を知りたい
-
vba Sleep関数について教えてく...
-
Tomcatのスレッドを破棄する方法
おすすめ情報