- PR -

メモリを大量に消費してしまい

1
投稿者投稿内容
janon
会議室デビュー日: 2003/04/02
投稿数: 13
お住まい・勤務地: 東京都
投稿日時: 2003-04-16 16:20
作成したWindowsアプリケーションが
メモリを大量に利用してしまい
悩んでいます。

インスタンス化した自作クラスの
オブジェクトをNothingにするだけでは
適切でないらしくメモリが開放されません。

自作クラスでは
System.Data.SqlClient、
System.Net.WebRequest、
System.IO.Stream、といったオブジェクトを
繰り返し繰り返し利用しています。

「タスクマネージャ」に表示される
メモリ使用量は安定しているのですが、

「パフォーマンスモニタ」の
.NET CLR Memoryを見ると
アプリケーションのヒープサイズが
徐々に徐々に増えて行き、
メモリ使用量の数倍のサイズに達します。

参考書で勉強しているのですが
うまい解決法が見当たりません。

どの様なツールや解説を参考にすれば
見通しが開けてくるか、どなたか
教えて頂ければ助かるのですが。
Qoo
大ベテラン
会議室デビュー日: 2003/04/08
投稿数: 121
投稿日時: 2003-04-16 20:19
こんにちは。

過去ログに解決の糸口があるかもしれませんよ。(^^
検索で、"GC"と入力してみては?
小野@どっとねっとふぁん
ぬし
会議室デビュー日: 2001/10/30
投稿数: 402
投稿日時: 2003-04-17 00:33
GCに対する理解も必要だけど、まずはDisposeかな。

#ちゃんとDisposeとかしておかないと、1世代あがってしまって
 GCの対象になりにくくなっちゃうはず。。。
janon
会議室デビュー日: 2003/04/02
投稿数: 13
お住まい・勤務地: 東京都
投稿日時: 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さん、
アドバイス有難うございました。

・・・

ところで不思議なのは、
タスクマネジャに表示されるメモリ使用量を
ヒープサイズの合計値が上回っている事が多いです。
何故かなあと思います。
Qoo
大ベテラン
会議室デビュー日: 2003/04/08
投稿数: 121
投稿日時: 2003-04-18 16:47
こんにちは。

> ところで不思議なのは、
> タスクマネジャに表示されるメモリ使用量を
> ヒープサイズの合計値が上回っている事が多いです。
> 何故かなあと思います。

タスクマネージャのメニューから"表示"->"列の選択"を選んで表示される画面で
「仮想メモリサイズ」をチェックして表示される値で確認してみてはどうでしょ?

(Googleで、”Windowsタスクマネージャ メモリ使用量”で検索していて
知ったことですが。。。(^^; )
1

スキルアップ/キャリアアップ(JOB@IT)