お世話になります。
現在C#で画像関連のプログラミングをしています。
ガベージコレクタがあるため安心してプログラムを組んでいたのですが、
参照されない画像を開放しないでいると、タスクマネージャーからメモリがどんどん増えていくのが確認できました。
具体的には、PictureBoxのImageに繰り返し代入していました。
ガベージコレクタは参照されなくなった変数を取りあえず放っておいて、
メモリが一杯になってきたら開放処理をするため、
快適なソフトを作るためにはできるだけガベージコレクタに頼らない方が
良いと考えました。
ですので今プログラム全体を見直して開放処理を加えているのですが、
厳密に言うとstring等にも開放処理を加えたほうがいいのでしょうか?
newで確保した変数や、関数からオブジェクトを受け取った時などは全て開放しなければ
いけないと思いますが、この認識で合っているでしょうか?
No.1ベストアンサー
- 回答日時:
基本的にはガベージコレクタに任せていて大丈夫です。
画像でどんどん空きメモリが減っていくのが気になるのであれば、pictureBox1.Image = Image.FromFile(xxx); のように PictureBox に直接 Image オプジェクトを設定する書き方になっていたら、Imageクラスのオブジェクトは一旦オブジェクト変数に置いて、完全に不要になった時点で image1.Dispose() として明示的に解放するように書きなおせばよいと思います。
ガベージがどうしても気になるなら、適切な位置で System.GC.Collect() を実行すれば良いでしょう。
ありがとうございます。
とりあえず
if (pictureBox1.Image != null)
pictureBox1.Image.Dispose();
pictureBox1.Image = Image.FromFile(filenName);
のようにして対処しました。
また、色々試すうちに気づいたのですが、Formに乗せたImageListは
Formを閉じてもなかなか開放されないようで、FormのDisposeをオーバーライドして
imageList1.Images.Clear();
imageList1.Dispose();
を入れるとおおむね直ぐに開放してくれるようでした。
とりあえず画像はちゃんと開放するようにしてみます。
No.2
- 回答日時:
C# のガベージコレクションがどうなっているかは知りませんが, 多くのガベージコレクションでは「OS から見たときのメモリ使用量は減らない」んじゃないですかね. 「OS に返す」のではなく, 「次にメモリを使うときのためにとっておく」のが普通だと思います.
まあ, いずれにしてもガベージコレクタを適切なタイミングで実行するのはよいことだと思います. その方がレスポンスも読めるし. 実際, 組み込み系などリアルタイム処理を要求されるところでは, 「ガベージコレクションをシステムに任せるとよくわからんタイミングで起きてその処理にかかる時間も要求された仕様を満たせるかどうかわからない」という理由でガベージコレクションを使わないということもあるようです.
No.1さんへのお礼のように対処しましたところ、タスクマネージャで確認する限りは
メモリの使用量が減ったようです。対処方法がガベージコレクションに関係していたか
どうかは分かりませんが、とりあえずOSに返してくれたようでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- モニター・ディスプレイ 原神とpcのスペックについて 1 2022/06/18 15:50
- PHP 掲示板を資料を参考にして開発中ですが、画像がアップされません? 1 2022/11/21 06:44
- IT・エンジニアリング 不具合の現状認識をしないプログラマって信用できる人? できない人? 8 2023/07/28 09:09
- その他(自然科学) 科学技術計算の仕事について 2 2023/02/04 18:09
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- Visual Basic(VBA) VBA★PDFをPDFアプリで印刷しようと思っていますが上手くゆきません 1 2022/06/06 22:04
- 環境・エネルギー資源 福島原発汚染水1リットルを飲むこともできるという発言で論議を呼んだ英国オックスフォード大 5 2023/05/20 07:14
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語で、メモリを解放しないで...
-
VBAの配列サイズとメモリに関して
-
C言語における再帰呼び出しの...
-
「ヒープサイズの設定」て何?
-
EXCEL-VBAにてADOのレコードセ...
-
「memcpy」と「strcpy」について
-
変数をあなたの身近なものに例...
-
エクセルVBA 大容量CSVファイル...
-
Linuxでexit()をフックするには?
-
FindFirstFile ハンドル開放
-
C#のOutOfMemoryException発生...
-
LoadLibraryしたらFreeLibrary
-
closeとメモリの開放について
-
matlabのメモリ制限 と inte...
-
移動可能メモリ
-
C言語初心者です。debug assert...
-
C++でメモリの絶対番地を指定...
-
バッチファイルでの実行EXEのメ...
-
メモリのセグメント違反の解決...
-
GPUプログラミング時の表示用GPU
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語で、メモリを解放しないで...
-
VBAの配列サイズとメモリに関して
-
「ヒープサイズの設定」て何?
-
エクセルのメモリ使用状況/Appl...
-
エクセルVBA 大容量CSVファイル...
-
EXCEL-VBAにてADOのレコードセ...
-
バッチファイルでの実行EXEのメ...
-
メモリ不足
-
メモリのセグメント違反の解決...
-
メモリが不足しています(VBA)
-
【C言語】再帰が時間がかかる...
-
ファイルマッピング関数で失敗
-
C言語:関数のメモリ上でのサイ...
-
メモリの解放の仕方
-
VC++におけるメモリ使用量について
-
メモリの消費量について
-
Bitmapを重ね合わせる方法
-
メモリを解放しないとどうなる?
-
C#のOutOfMemoryException発生...
-
メモリの解放について VB6 VBA
おすすめ情報