DOBON.NET DOBON.NETプログラミング掲示板過去ログ

オブジェクト変数の開放

環境/言語:[VB.NET2003 FRAMEWORK1.1]
分類:[.NET]

VB6でオブジェクトを開放するときはNOTHINGが定番ですが、VB.NETではその処理は不要でむしろガーベージコレクションを任意で呼び出すとCPUに負荷がかかりおすすめできないという内容をみつけました。

しかしある処理でどうも開放されていない(NEWで新規に作れない)状況に陥り、
任意で開放する方法がないかを探しております。

CPUに負荷をかけずに確実に開放する方法はあるのでしょうか?

ご存知の方がおられましたら、ご教授おねがいします。
  • 題名: Re[1]: オブジェクト変数の開放
  • 著者: よねKEN
  • 日時: 2007/07/17 22:59:19
  • ID: 20095
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No20094に返信(たこさんの記事)
> VB6でオブジェクトを開放するときはNOTHINGが定番ですが、
> VB.NETではその処理は不要でむしろガーベージコレクションを任意で呼び出すと
> CPUに負荷がかかりおすすめできないという内容をみつけました。

VB6とVB.NETでは変数による参照が無くなった後のメモリの開放のされ方は違いますが、
参照そのものの考え方は特に変わっていません。

VB6でNothingを使って意味のあるシチュエーションでは、
VB.NETでも同様の処理は同じく意味があるでしょうし、
VB.NETでNothingをセットすることに意味がない状況では、
VB6でも基本的に同じでNothingをセットすることに意味はありません。

VB6とVB.NETとで異なるのはオブジェクトへの参照を保持する変数が
なくなった後の挙動ですね。
これはおっしゃるようにVB.NETではガベージコレクタが動作したタイミングになります。

> しかしある処理でどうも開放されていない(NEWで新規に作れない)状況に陥り、
> 任意で開放する方法がないかを探しております。

「NEWで新規に作れない」とはどういう状況でしょうか?
OutOfMemoryExceptionが発生するとかでしょうか?

いずれにしてもインスタンスが作れない状況に陥っている
根本原因を究明して、そちらのソースコードを改善するべきだと思います。

・インスタンスを無駄に作りすぎているとか
・メモリがそもそも少ないとか、
・もっと別の理由でメモリを使いすぎているとか
・使い終わったインスタンスを参照している変数が残っているとか

現状の起きている問題がよくわからないので
どうすれば解決できるかについてはなんともいえません。

> CPUに負荷をかけずに確実に開放する方法はあるのでしょうか?

解放されるべき状態になっているインスタンスが溜まっていれば、
適宜、ガベージコレクタが動作して解放されますので、
解放されないということはプログラムで解放できない状態
(インスタンスを参照している変数がある=使用中)になっている可能性が高いです。

強制的に動作させたければ、GC.Collectメソッドで動作させることはできますが、
もちろん使用中のインスタンスは解放されません。

DOBON.NET | プログラミング道 | プログラミング掲示板