タイトル | : クラスの破棄について |
記事No | : 8927 |
投稿日 | : 2009/05/12(Tue) 11:54 |
投稿者 | : ダンボ |
(1枚の画像)または(100枚程度の画像セット)毎に1つの管理クラス(ProfileClass) を割り当てているアルバム管理ソフトでの話です。メモリ使用量は1クラスあたり ・定常時56Kバイト ・画像操作時12.3Mバイト と見積もりました。全画像は4,000枚程度あり、一気にすべてクラスを割り当てても 240Mバイト程度のメモリ使用量で済むという計算です。実際は管理不要になるたび にProfileClassを破棄するので定常時は500枚分30Mバイト程度で行けるかと思っていました。
Public Class ProfileClass(主要メンバのみ) Public Event Updated(ByVal sender As Object, ByVal e As PFEventArgs) Protected NextPr As ProfileClass 'Nextクラス(スライドショーのとき使う) Public Cache As CacheClass 'メモリが許す限り破棄せずに再利用する Public frm As Form '表示に使うフォーム Public Super As ProfileClass '上位クラス Public Contents As New System.Collections.Generic.List(Of ProfileClass) '子クラス(100個程度)のプロファイル Public SelectedIndex As Integer '最後にアクセスした子クラスのインデックス Public DefFileFullPath As String '定義ファイルor画像ファイルの場所 Public Category As UInteger '画像分類 Public Title As String '画像タイトル Public Description As String '画像説明 Public Icon As Image '画像サムネール(56KB程度) Public Image As Image '画像本体(12.3MB程度) Public CreateDate As Date Public ModifyDate As Date Public AccessDate As Date End Class
ところが、試験するとメモリ使用量が右肩上がりで増え続け1Gバイト超です。 ProfileClass.Finalize にトレースを入れてみるとSub Main()を抜けた後に たくさんのProfileインスタンスが破棄されていました。orz
ProfileClassの破棄はProfile = Nothing ProfileClass.Imageの破棄はProfile.Image.Dispose()、 Profile.Image = Nothing でO.K.かと思ったんですが違うんですか?
http://msdn.microsoft.com/ja-jp/library/fs2xkftw(VS.80).aspx http://www.atmarkit.co.jp/fdotnet/dotnettips/027dispose/dispose.html などを見て、ProfileClass.Disposeメソッドを実装し、 Profile.Dispose() Profile = Nothing を実行したところ、メモリ使用量の右肩上がりは止まりSub Main後のFinalizeも 無くなったのでProfileClassの破棄は設計どおりになったと思います。
質問1.下記の認識(思い込み)の正誤を教えてください。 ・Disposeメソッドが用意されていないクラスの破棄は = Nothing だけで良い。 ・New()で生成したクラスはマネージドクラスである。 ・マネージドクラスの破棄は = Nothing だけで良い。 ・Finalizeメソッドを呼んだだけではクラスの破棄は行われない。 ・Finalizeメソッドはシステムから呼ばれるだけのものであり、APPから呼ぶことはあまり無い。 (Newとの対比から、Newで生成/Finalizeで破棄と思い込んでいました)
質問2. Profile.Dispose() Profile = Nothing のようにDisposeを実行した後での = Nothingは無意味ですよね?
|