- - PR -
メモリを大量に消費してしまい
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2003-04-16 16:20
作成したWindowsアプリケーションが
メモリを大量に利用してしまい 悩んでいます。 インスタンス化した自作クラスの オブジェクトをNothingにするだけでは 適切でないらしくメモリが開放されません。 自作クラスでは System.Data.SqlClient、 System.Net.WebRequest、 System.IO.Stream、といったオブジェクトを 繰り返し繰り返し利用しています。 「タスクマネージャ」に表示される メモリ使用量は安定しているのですが、 「パフォーマンスモニタ」の .NET CLR Memoryを見ると アプリケーションのヒープサイズが 徐々に徐々に増えて行き、 メモリ使用量の数倍のサイズに達します。 参考書で勉強しているのですが うまい解決法が見当たりません。 どの様なツールや解説を参考にすれば 見通しが開けてくるか、どなたか 教えて頂ければ助かるのですが。 |
|
投稿日時: 2003-04-16 20:19
こんにちは。
過去ログに解決の糸口があるかもしれませんよ。(^^ 検索で、"GC"と入力してみては? |
|
投稿日時: 2003-04-17 00:33
GCに対する理解も必要だけど、まずはDisposeかな。
#ちゃんとDisposeとかしておかないと、1世代あがってしまって GCの対象になりにくくなっちゃうはず。。。 |
|
投稿日時: 2003-04-18 14:28
Nothingにセットされたオブジェクト変数は 勝手にガーベージコレクトされるのかと 思っていましたが、そうではない場合が 多いのだなあということがまず分かってきました。 パフォーマンスモニタで .NET CLR Memoryの Gen 2 Heap Sizeを見ていると 減っては増え、減っては増えるのを 繰り返しながら全体的に増えて行く 様子がわかりいます。 次のような点に注意しながら コードを見直してみる事にしました。 System.IO、System.Net System.Data.といった リソースを利用するオブジェクト変数は そのスコープを確認してClose、 またはDisposeが適切に行われるようにする。 スコープの広いオブジェクト変数については 安易にNothingをセットして 再びNewを繰り返さない。 FinalizeをOverrideして利用しない。 そんな方針でプログラムを見直してみます。 方針として不適切である場合や 気をつけねばならないことがあれば 書き込んで教えていただければと思います。 今、.NET CLR Memoryのカウンタと にらめっこしながら ステップ実行しています。 原因が分かり次第また書き込みたいと思います。 Qooさん、 SHUさん、 アドバイス有難うございました。 ・・・ ところで不思議なのは、 タスクマネジャに表示されるメモリ使用量を ヒープサイズの合計値が上回っている事が多いです。 何故かなあと思います。 |
|
投稿日時: 2003-04-18 16:47
こんにちは。
> ところで不思議なのは、 > タスクマネジャに表示されるメモリ使用量を > ヒープサイズの合計値が上回っている事が多いです。 > 何故かなあと思います。 タスクマネージャのメニューから"表示"->"列の選択"を選んで表示される画面で 「仮想メモリサイズ」をチェックして表示される値で確認してみてはどうでしょ? (Googleで、”Windowsタスクマネージャ メモリ使用量”で検索していて 知ったことですが。。。(^^; ) |
1