- ベストアンサー
C#のガベージコレクタについて
お世話になります。 現在C#で画像関連のプログラミングをしています。 ガベージコレクタがあるため安心してプログラムを組んでいたのですが、 参照されない画像を開放しないでいると、タスクマネージャーからメモリがどんどん増えていくのが確認できました。 具体的には、PictureBoxのImageに繰り返し代入していました。 ガベージコレクタは参照されなくなった変数を取りあえず放っておいて、 メモリが一杯になってきたら開放処理をするため、 快適なソフトを作るためにはできるだけガベージコレクタに頼らない方が 良いと考えました。 ですので今プログラム全体を見直して開放処理を加えているのですが、 厳密に言うとstring等にも開放処理を加えたほうがいいのでしょうか? newで確保した変数や、関数からオブジェクトを受け取った時などは全て開放しなければ いけないと思いますが、この認識で合っているでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
基本的にはガベージコレクタに任せていて大丈夫です。 画像でどんどん空きメモリが減っていくのが気になるのであれば、pictureBox1.Image = Image.FromFile(xxx); のように PictureBox に直接 Image オプジェクトを設定する書き方になっていたら、Imageクラスのオブジェクトは一旦オブジェクト変数に置いて、完全に不要になった時点で image1.Dispose() として明示的に解放するように書きなおせばよいと思います。 ガベージがどうしても気になるなら、適切な位置で System.GC.Collect() を実行すれば良いでしょう。
その他の回答 (2)
- taku2888
- ベストアンサー率60% (15/25)
お礼
ありがとうございます。参考にさせていただきます。
- Tacosan
- ベストアンサー率23% (3656/15482)
C# のガベージコレクションがどうなっているかは知りませんが, 多くのガベージコレクションでは「OS から見たときのメモリ使用量は減らない」んじゃないですかね. 「OS に返す」のではなく, 「次にメモリを使うときのためにとっておく」のが普通だと思います. まあ, いずれにしてもガベージコレクタを適切なタイミングで実行するのはよいことだと思います. その方がレスポンスも読めるし. 実際, 組み込み系などリアルタイム処理を要求されるところでは, 「ガベージコレクションをシステムに任せるとよくわからんタイミングで起きてその処理にかかる時間も要求された仕様を満たせるかどうかわからない」という理由でガベージコレクションを使わないということもあるようです.
お礼
No.1さんへのお礼のように対処しましたところ、タスクマネージャで確認する限りは メモリの使用量が減ったようです。対処方法がガベージコレクションに関係していたか どうかは分かりませんが、とりあえずOSに返してくれたようでした。
お礼
ありがとうございます。 とりあえず if (pictureBox1.Image != null) pictureBox1.Image.Dispose(); pictureBox1.Image = Image.FromFile(filenName); のようにして対処しました。 また、色々試すうちに気づいたのですが、Formに乗せたImageListは Formを閉じてもなかなか開放されないようで、FormのDisposeをオーバーライドして imageList1.Images.Clear(); imageList1.Dispose(); を入れるとおおむね直ぐに開放してくれるようでした。 とりあえず画像はちゃんと開放するようにしてみます。