- PR -

GC.SuppressFinalize()メソッドについて

投稿者投稿内容
jornada690
常連さん
会議室デビュー日: 2006/06/13
投稿数: 25
投稿日時: 2007-06-04 02:21
初歩的な質問なのですが、
あるインスタンスを破棄する時にGC.SuppressFinalize()メソッドを呼び出して、ガベージコレクション時にファイナライザ(デストラクタ)が呼ばれないようにした場合、このインスタンスのメモリは普通に解放されるのでしょうか?
GC.SuppressFinalize()メソッドの意味合いとしては、ガベージコレクションによってメモリは解放されるが、ファイナライザが呼ばれないだけと考えてよいのでしょうか?
よろしくお願いします。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-06-04 08:38
IDisposable.Disposeなんかが実装しているオブジェクトってのはDIsposeの中で済ませてしまえばファイナライザは不要だよな?
そういう時に使うんだと仮定して考えてみたら?
jornada690
常連さん
会議室デビュー日: 2006/06/13
投稿数: 25
投稿日時: 2007-06-04 12:04
回答有難うございます。
>IDisposable.Disposeなんかが実装しているオブジェクトってのはDIsposeの中で済ませ>てしまえばファイナライザは不要だよな?

確かに不要ですね。ただ私が思ったのは、ファイナライザが呼ばれないと、ガベージコレクタが、不要になったこのオブジェクトのメモリを解放してくれないのかなということです。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2007-06-04 12:33
ファイナライザがメモリの解放をしているわけではなく、メモリを解放する時(直前?)に呼ばれるだけです。
jornada690
常連さん
会議室デビュー日: 2006/06/13
投稿数: 25
投稿日時: 2007-06-04 12:45
回答有難うございます。
結論的には、ちゃんと解放してくれるけれども解放の直前に呼び出すファイナライザは呼び出さないようにするだけと考えてよろしいのですね。
有難うございました。
ちなみに、不要になったあるオブジェクトのメモリがガベージコレクションによって解放されたのを確認できるデバッグツールってあるのでしょうか?ファイナライザが呼ばれる時はデストラクタにブレークポイントなどの仕掛けをしておけば分かると思いますが、実際にそのメモリアドレスが、解放された、まだされていないの確認ができれば安心だと思いまして。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2007-06-04 12:58
引用:

結論的には、ちゃんと解放してくれるけれども解放の直前に呼び出すファイナライザは呼び出さないようにするだけと考えてよろしいのですね。


厳密には、CLR はファイナライザを呼び出すキューを管理しているので、GC.SuppressFinalize() を呼び出すと、そのキューから削除するというのが正しい挙動かと思います。

引用:

ちなみに、不要になったあるオブジェクトのメモリがガベージコレクションによって解放されたのを確認できるデバッグツールってあるのでしょうか?ファイナライザが呼ばれる時はデストラクタにブレークポイントなどの仕掛けをしておけば分かると思いますが、実際にそのメモリアドレスが、解放された、まだされていないの確認ができれば安心だと思いまして。


普通は気にする事ではないのですが、CLR プロファイラというツールがあります。Microsoft ダウンロードセンターから最新版をダウンロードして下さい。
http://www.microsoft.com/japan/msdn/enterprise/pag/scalenethowto13.aspx
_________________
囚人のジレンマな日々
jornada690
常連さん
会議室デビュー日: 2006/06/13
投稿数: 25
投稿日時: 2007-06-04 13:11
有難うございます。
理解できました。
実証を得るために、「CLR プロファイラ」使用してみたいと思います。

みなさん、有難うございました。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2007-06-04 14:19
引用:

jornada690さんの書き込み (2007-06-04 12:45) より:
ちなみに、不要になったあるオブジェクトのメモリがガベージコレクションによって解放されたのを確認できるデバッグツールってあるのでしょうか?ファイナライザが呼ばれる時はデストラクタにブレークポイントなどの仕掛けをしておけば分かると思いますが、実際にそのメモリアドレスが、解放された、まだされていないの確認ができれば安心だと思いまして。


どのようじゃ目的を持っているのか分からないですが、GC.SuppressFinalize()の話からスレッドが始まっていることを考えると、
「メモリが解放されたことを確認したいが、ファイナライザが実行されたという事象によって確認しようとしてもGC.SuppressFinalize()によって解放されたタイミングで実行されないされないことがあるので、他のメモリ解放の確認方法はないか。」
といったことでしょうか。

もしそうなら「弱い参照」を使うというのはどうでしょうか。
弱い参照は、参照しているオブジェクトがGCの対象になることを妨げません。
そして、参照しているオブジェクトがGCによりメモリが解放されるとそれが分かります。
WeakReferenceというクラスを使ってみてください。

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