こんにちは。現在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.1
- 回答日時:
たぶんPopGetThreadにメモリリーク(オブジェクトの未解放)があるんでしょうね。
もひとつ、forループにおけるthread.join()の意味がわかりませんが…。要らないのでは?
この回答への補足
_ranco_さんありがとうございます。
たぶんPopGetThreadにメモリリーク(オブジェクトの未解放)があるんでしょうね。>>
それは、PopGetThread自身の未解放という意味でしょうか。それとも、PopGetThreadがパラメータとして持つ何か、と言う意味でしょうか。
forループにおけるthread.join()>>
えっと、これは各POPアカウントのすべてのメール受信の処理が完全に終わったら、次の処理へ移ると言う仕様でして、すべてのthreadの終了を判断できるように、ということで入れた処理なんですが、これは不要ですか??
No.2ベストアンサー
- 回答日時:
こんにちは。
>えっと、これは各POPアカウントのすべてのメール受信の処理が完全に終わったら、
>次の処理へ移ると言う仕様でして、すべてのthreadの終了を判断できるように、
>ということで入れた処理なんですが、これは不要ですか??
これでは、スレッドが同時実行されないので、マルチスレッドにしている意味がないのでは?
同時実行する気がないのなら普通にシングルスレッドで実行すればよいですし、同時実行するのなら、ThreadPoolExecutorとかを使って、スレッド数をコントロールした方がいいんじゃないでしょうか?
PecoPlusさん、ありがとうございます。ThreadPoolExecutorというものがあったんですね・・。初めて知りました。ご教授ありがとうございます。とりあえずそれを試してみようと思います。
お探しの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ランキング
-
PHPでDB処理中にプログレスバー...
-
Java ファイルが生成させたか確...
-
Javaでのデバッグコード削除
-
ラジオボタンの選択判定
-
アコーディオンメニューをアン...
-
エクセルVBAで、条件に一致する...
-
変数名の付け方
-
複数の変数を宣言する時、同時...
-
Java初級 引数に適用できません
-
「タイプ初期化子が例外をスロ...
-
C#において、同じインスタンス...
-
private static という変数の修飾
-
Vba ListViewの行挿入に関して...
-
内部クラスを別ファイルに
-
「ラッパークラス」の存在意義...
-
グローバルIPとプライベートIP...
-
クラス間でのデータ参照
-
生成したインスタンスを削除す...
-
IPアドレスのクラスAを取得して...
-
Vbで通常使用するプリンターを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
tryの終了
-
数値の定数を付ける時
-
Javaでのデバッグコード削除
-
C#で別スレッドの終了を知りたい
-
[Java] while(true)の意味
-
Tomcatのスレッドを破棄する方法
-
Javaプログラムからポップアッ...
-
ラジオボタンの選択判定
-
JavaScriptからJAVAクラスを呼...
-
素数判定を再帰処理で
-
PHPでDB処理中にプログレスバー...
-
Javaアプリケーション実行の返...
-
WPF C#でF10のイベント取得方法...
-
switch文の中に、throws new Ex...
-
doGetとdoPostの違い
-
ExcelVBA で文字列の特定の文字...
-
Tomcat高負荷時の設定について
-
ラベルの表示までが異常に遅い...
-
JDBCでテーブルUPDATE後の再検...
-
ftp 同時複数接続の負荷テスト...
おすすめ情報