The project of U-WA-
http://uwa.potetihouse.com/
トップページ > 過去ログ > 記事閲覧
アイコン [TKMP]でOutOfMemoryException
日時: 2012/07/26 13:30
名前: ういんぐ

TKMP 3.0.1を使用しています。
長時間(1、2日)使用していると以下のようにOutOfMemoryExceptionが発生します。

種類 'System.OutOfMemoryException' の例外がスローされました。
場所 TKMP.Net.PopClient. (String& )
場所 TKMP.Net.PopClient.Connect()

以下にサンプルのソースを記載します。

//サーバーのIPアドレスを取得
System.Net.IPAddress address = System.Net.Dns.GetHostEntry(server).AddressList[0];

//ログオン情報設定
TKMP.Net.IPopLogon logon = new TKMP.Net.BasicPopLogon(userid, pass);

//POP3接続設定
TKMP.Net.PopClient pop = new TKMP.Net.PopClient(logon, address, port);

//接続
if (pop.Connect()) {
メール処理
pop.Close();
}

以上の処理を定期的に実行します(1分間隔くらい)

よろしくお願いします。

Page: 1 | 2 |

ファイル Re: [TKMP]でOutOfMemoryException ( No.3 )
日時: 2012/07/27 11:06
名前: Toki◆pRU.c9X.EOI

TKMP.Net.PopClientクラスのインスタンスを接続毎に作成してみてはどうでしょうか?

TKMP.Net.PopClientクラスはClose処理だけでは内部に通信ログが残ったままになります。

インスタンスの作成を控えたいなら、
pop.MessageLog.Clear();
を定期的に実行してみてください。
ファイル Re: [TKMP]でOutOfMemoryException ( No.4 )
日時: 2012/07/27 13:18
名前: ういんぐ

> TKMP.Net.PopClientクラスのインスタンスを接続毎に作成してみてはどうでしょうか?

実際の処理ループは以下のようになっています。

while(true) {
try {
//サーバーのIPアドレスを取得
System.Net.IPAddress address = System.Net.Dns.GetHostEntry(server).AddressList[0];

//ログオン情報設定
TKMP.Net.IPopLogon logon = new TKMP.Net.BasicPopLogon(userid, pass);

//POP3接続設定
TKMP.Net.PopClient pop = new TKMP.Net.PopClient(logon, address, port);

//接続
if (pop.Connect()) {
メール処理
pop.Close();
}
}
catch(Exception ex) {
ログ出力
}
}
なので、毎回 TKMP.Net.PopClientクラスのインスタンスを作成しています。

ちなみに、この中のif (pop.Connect()) { メール処理 pop.Close(); } をコメントにして実行すると、メモリ使用量の増加は発生しないので、pop.Connect()中の何らかのメモリが残るように思います。
メール処理だけをはずしてもメモリ増加が見られます。

よろしくお願いします。
ファイル Re: [TKMP]でOutOfMemoryException ( No.5 )
日時: 2012/07/27 13:55
名前: ういんぐ

追加情報ですが、頻繁にメールサーバーに実際にアクセスするとサーバーに負荷をかける
ことになるため、接続できない状態で実行しています。

従って、pop.Connect()は接続できない旨の例外を返します。その際はログ出力してループ
します。

なので、メール処理が実際に実行されることはありません。

この状況は関係しているでしょうか?
ファイル Re: [TKMP]でOutOfMemoryException ( No.6 )
日時: 2012/07/27 14:43
名前: Toki◆pRU.c9X.EOI

ご報告ありがとうございます。

いろいろと調査したところ、
サーバーとの通信が確立して、ログオン等に失敗した場合に
通信スレッドが開放されない事がわかりました。

ログオンに成功した場合や、接続自体に失敗した場合は問題ないようです。

近日中に修正版をULします。
ファイル Re: [TKMP]でOutOfMemoryException ( No.7 )
日時: 2012/07/27 17:43
名前: ういんぐ

> ログオンに成功した場合や、接続自体に失敗した場合は問題ないようです。

通常使用には問題ないということですね。
調査、ありがとうございます。

> 近日中に修正版をULします。

修正版を楽しみにしています。

ありがとうございました。
ファイル Re: [TKMP]でOutOfMemoryException ( No.8 )
日時: 2012/07/31 13:47
名前: ういんぐ

修正版TKMP v3.1.1 を試してみました。

pop.Connect()が以下のようなエラーを返す状況でメモリ使用量を
リソースモニタで確認しました。

ケース1
接続に失敗しました
場所 TKMP.Net.PopClient. (String& )
場所 TKMP.Net.PopClient.Connect()
場所 ResNaviMail.RecvMail.Connect()

ケース2
対象のコンピューターによって拒否されたため、接続できませんでした。 xxx.xxx.xxx.xxx:110
場所 TKMP.Net.PopClient. (String& )
場所 TKMP.Net.PopClient.Connect()
場所 ResNaviMail.RecvMail.Connect()

v3.0.1 のときほど多くはありませんが、やはり、徐々にメモリ使用量は増えていきます。
pop.Connect()の直前で、GC.Collect()を呼んでいるのは変わりません。

GC.Collect()時点で若干使用メモリ量は減りますが、その後、それ以上のメモリ増加が見られます。

以上が確認結果です。
ファイル Re: [TKMP]でOutOfMemoryException ( No.9 )
日時: 2012/08/01 08:20
名前: Toki◆pRU.c9X.EOI

度々ご報告ありがとうございます。

前回は正常接続後のログオン失敗部分のみしか修正できていませんでした。

接続失敗時の処理を見直してもう一度修正してみます。
ファイル Re: [TKMP]でOutOfMemoryException ( No.10 )
日時: 2012/08/09 18:17
名前: ういんぐ

修正版TKMP v3.1.2 を試してみました。

pop.Connect()が前回と同じくエラーを返す状況でメモリ使用量を
リソースモニタで確認しました。

v3.1.1 のときより若干少なめかなとは思うのですが、やはり、徐々にメモリ使用量は増えて
いく状況は変わりません。

以上が確認結果です。

実運用上はエラーになることはないので、メモリが増える状況にはないので実害はないのですが
やはり、気にはなります。
ファイル Re: [TKMP]でOutOfMemoryException ( No.11 )
日時: 2012/08/10 07:49
名前: Toki◆pRU.c9X.EOI

ライブラリで開放されないメモリが存在するならば、
終了していないスレッドが利用しているメモリしかないと考えています。

メモリが消費されるときにスレッドの増加があるか確認していただけませんか?

ファイル Re: [TKMP]でOutOfMemoryException ( No.12 )
日時: 2012/08/10 13:13
名前: ういんぐ

ProcessExploreで確認したところスレッド増加はありませんでした。

さらに、時間をかけてメモリ使用量を追っていくと、1時間半ほど経過した時点で
一気に解放されました。

どうも、ガベージコレクタのストラテジによる一時的な使用量の増加のようです。
ということで、エラー時にもメモリが増え続けるわけではないことを確認しました。

ありがとうございました。

Page: 1 | 2 |