○タスクマネージャで監視してもメモリ使用量は増えていません。物理メモリには十分な余裕があり、ハンドルやカーネルメモリなどタスクマネージャ内で見える数字に異常は見当たりません。
○MSのDesktop Heap Monitor Toolで監視してもUsedRate等に変化はありません。
○プログラムはWindowsAPI(アタッチスレッドなどいろいろ)やCOMを非常に多用し、外部プログラム(これも自作)を何度も起動させます。
○自作プログラムはC#とC++のDLLで書かれています。
何が原因として考えられるのでしょうか?
メモリー破壊とかしてないのでしょうか?
確率論なので、メモリー破壊をしていてもたいていの場合問題なく動作したりしますけど、
長時間動作させたりすると確率が上がるので、エラーとして検出されるという可能性は?
回答ありがとうございます。
ありえる事だと思います。
その点注意して今から見直してみます。
とりあえずこれで調べてみてはどうでしょうか。
AppVerifier には次のような機能があります。
• メモリのチェック。 バッファ オーバーランといった、アプリケーション内で起こる各種のメモリ関連問題をテストします。
• カーネルオブジェクトの追跡。 スタック、ハンドル、およびロックが正しく使用されているかどうかをテストします。AppVerifier は、ダブルフリー (解放されたオブジェクトへのアクセス試行) といったシナリオの警告を発します。
• セキュリティのテスト。 一般的なセキュリティ問題に関するテストを提供します。アプリケーションがいつオブジェクトを作成し、ACL を割り当てるかなどを調べます。
• DFW システムの使用。 レジストリとファイル システムの使用が Designed for Windows XP ロゴの規定に準じているかどうかを調べます。
AppVerifierというのは知りませんでした。
でもこれを実行していると自作プログラムが強制終了するようです…
うまく使えば非常に有用そうです。ありがとうございました。
OSを2000以降のものと仮定しますが…
メインメモリが余っていても、システムリソースの不足が発生することは十分にありえます。おそらくUSERリソースかGDIリソースを、何らかの原因で使い果たしたのではないでしょうか。
Windows 98以前と比べると、2000以降はシステムリソースはわりと潤沢(USERとGDIで計3MB)になりましたが、それでも限界があります。しかもこのへんは、taskmgr.exe では見えづらいはずです。
レジストリの HKLM¥¥SYSTEM¥CurrentControlSet¥Control¥Session Manager¥SubSystem の値が、システムリソースの制限値を定義しています。デフォルトでは 3072 (単位はKB)のはずです。変更後は再起動が必要です。
これを増やしてみてプログラムの挙動が変わる場合は、ほぼ間違いなくアプリケーションヒープ領域(システムリソース領域)が何らかの原因でリークしていると思われます。試してみてください。
回答ありがとうございます。
デスクトップアプリケーションヒープは質問文にあるDesktop Heap Monitor Toolで
使用量を参照できるそうです。まったく変化ありませんでした。
レジストリで3072を大きな値に書き換えている情報は至る所にありますが、
長時間経たないと発現しない(リークの兆候が止まるまで見えない)ものであり
処理が通るか通らないかというものではないので、挙動がかわったと気づくことすら困難です。
「システムリソース不足」とは具体的にどのような事象が発生するのでしょうか?
何らかのAPIの戻り値なのか、エラーメッセージでしょうか?
リソース不足時にイベントビューワやDebugViewで何か有意な情報は出力されませんか?
物理メモリが十分でも仮想メモリが不足している可能性があります。長時間というキーワードから、仮想アドレス空間に断片化が発生して十分な連続した仮想アドレス帯を確保できなくなっている可能性も考えられます。その場合はアプリを再起動するしかないかもしれません。
こちらに仮想メモリに関する問題の説明と、調査、解決方法がいくつかありますので確認してみてください。Exchange Serverとありますが、仮想メモリなど基本的な概念はXPやVistaなどでも同じです。
[Support WebCast] Exchange 2000 Server における仮想メモリ断片化のトラブルシューティング
説明中の仮想アドレスダンプユーティリティ(vadump)はリンク切れですがここでダウンロード可能です。
メモリは解放できていると思います。C#側で強制的にGCを動かすことはしていませんが、
物理メモリの使用量には問題がないのでガベージコレクションが原因とは考えなかったのですが、
ガベージコレクションが原因でシステムリソースに影響がでることはあるのでしょうか?