tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル クラスの破棄について
投稿日: 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は無意味ですよね?

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。