自作プログラムを長時間実行させると、システムリソース不足になってしまいます。


○タスクマネージャで監視してもメモリ使用量は増えていません。物理メモリには十分な余裕があり、ハンドルやカーネルメモリなどタスクマネージャ内で見える数字に異常は見当たりません。

○MSのDesktop Heap Monitor Toolで監視してもUsedRate等に変化はありません。

○プログラムはWindowsAPI(アタッチスレッドなどいろいろ)やCOMを非常に多用し、外部プログラム(これも自作)を何度も起動させます。

○自作プログラムはC#とC++のDLLで書かれています。

何が原因として考えられるのでしょうか?

回答の条件
  • 1人2回まで
  • 登録:2007/12/11 14:11:09
  • 終了:2007/12/18 13:10:03

回答(5件)

id:careplanner No.1

らいず回答回数338ベストアンサー獲得回数132007/12/11 15:40:09

ポイント20pt

C言語の基本といえば基本なので確認ですが、ガーベージコレクションを実行してますか?

http://www.nurs.or.jp/~sug/soft/super/gc.htm

id:sarusaruru

メモリは解放できていると思います。C#側で強制的にGCを動かすことはしていませんが、

物理メモリの使用量には問題がないのでガベージコレクションが原因とは考えなかったのですが、

ガベージコレクションが原因でシステムリソースに影響がでることはあるのでしょうか?

2007/12/11 17:19:33
id:KUROX No.2

KUROX回答回数3542ベストアンサー獲得回数1402007/12/11 22:09:44

ポイント20pt

メモリー破壊とかしてないのでしょうか?

確率論なので、メモリー破壊をしていてもたいていの場合問題なく動作したりしますけど、

長時間動作させたりすると確率が上がるので、エラーとして検出されるという可能性は?

id:sarusaruru

回答ありがとうございます。

ありえる事だと思います。

その点注意して今から見直してみます。

2007/12/11 22:17:17
id:ardarim No.3

ardarim回答回数892ベストアンサー獲得回数1422007/12/12 00:03:07

ポイント20pt

とりあえずこれで調べてみてはどうでしょうか。

Windows Application Verifier

AppVerifier には次のような機能があります。

• メモリのチェック。 バッファ オーバーランといった、アプリケーション内で起こる各種のメモリ関連問題をテストします。

• カーネルオブジェクトの追跡。 スタック、ハンドル、およびロックが正しく使用されているかどうかをテストします。AppVerifier は、ダブルフリー (解放されたオブジェクトへのアクセス試行) といったシナリオの警告を発します。

• セキュリティのテスト。 一般的なセキュリティ問題に関するテストを提供します。アプリケーションがいつオブジェクトを作成し、ACL を割り当てるかなどを調べます。

• DFW システムの使用。 レジストリとファイル システムの使用が Designed for Windows XP ロゴの規定に準じているかどうかを調べます。

id:sarusaruru

AppVerifierというのは知りませんでした。

でもこれを実行していると自作プログラムが強制終了するようです…

うまく使えば非常に有用そうです。ありがとうございました。

2007/12/12 01:21:30
id:gtk042 No.4

gtk042回答回数5ベストアンサー獲得回数12007/12/12 11:40:27

ポイント20pt

OSを2000以降のものと仮定しますが…

メインメモリが余っていても、システムリソースの不足が発生することは十分にありえます。おそらくUSERリソースかGDIリソースを、何らかの原因で使い果たしたのではないでしょうか。

Windows 98以前と比べると、2000以降はシステムリソースはわりと潤沢(USERとGDIで計3MB)になりましたが、それでも限界があります。しかもこのへんは、taskmgr.exe では見えづらいはずです。

レジストリの HKLM¥¥SYSTEM¥CurrentControlSet¥Control¥Session Manager¥SubSystem の値が、システムリソースの制限値を定義しています。デフォルトでは 3072 (単位はKB)のはずです。変更後は再起動が必要です。

これを増やしてみてプログラムの挙動が変わる場合は、ほぼ間違いなくアプリケーションヒープ領域(システムリソース領域)が何らかの原因でリークしていると思われます。試してみてください。

id:sarusaruru

回答ありがとうございます。

デスクトップアプリケーションヒープは質問文にあるDesktop Heap Monitor Toolで

使用量を参照できるそうです。まったく変化ありませんでした。

レジストリで3072を大きな値に書き換えている情報は至る所にありますが、

長時間経たないと発現しない(リークの兆候が止まるまで見えない)ものであり

処理が通るか通らないかというものではないので、挙動がかわったと気づくことすら困難です。

2007/12/12 11:50:18
id:ardarim No.5

ardarim回答回数892ベストアンサー獲得回数1422007/12/14 01:39:53

ポイント20pt

「システムリソース不足」とは具体的にどのような事象が発生するのでしょうか?

何らかのAPIの戻り値なのか、エラーメッセージでしょうか?


リソース不足時にイベントビューワやDebugViewで何か有意な情報は出力されませんか?


物理メモリが十分でも仮想メモリが不足している可能性があります。長時間というキーワードから、仮想アドレス空間に断片化が発生して十分な連続した仮想アドレス帯を確保できなくなっている可能性も考えられます。その場合はアプリを再起動するしかないかもしれません。

こちらに仮想メモリに関する問題の説明と、調査、解決方法がいくつかありますので確認してみてください。Exchange Serverとありますが、仮想メモリなど基本的な概念はXPやVistaなどでも同じです。

[Support WebCast] Exchange 2000 Server における仮想メモリ断片化のトラブルシューティング


説明中の仮想アドレスダンプユーティリティ(vadump)はリンク切れですがここでダウンロード可能です。

管理タスクの Windows 2000 リソース キット ツール

  • id:dev_zer0
    C/C++には標準でガベージコレクションなんて機能は無いですよ
    また、一般的にガベージコレクションはメモリ以外のリソースは勝手に解放しません
    多分、メモリ以外のリソースが足りなくなっているのでしょうが
    # 例えばDBのコネクションとか、通信のソケットとか
    質問文では何のリソースを使用しているか不明なのでこれ以上の予想は出来ません
  • id:sarusaruru
    コメントありがとうございます。
    DBは利用していませんし、ネットワークも利用しません。
    COMの参照カウンタの解放ミスによるものを疑っているのですが、
    物理メモリに影響せずにリソースが残ること自体に???という状態です。
  • id:gtk042
    すいません。回答4のレジストリキー、
    『HKLM¥SYSTEM¥CurrentControlSet¥Control¥Session Manager¥SubSystem の 「Windows」キー 』が正しいです。最後のキー名が抜けてました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません