0

windbg でファイナライズ キュー コマンドを実行すると、以下の結果が得られました。

0:121> !finalizequeue
SyncBlocks to be cleaned up: 0
MTA Interfaces to be released: 0
STA Interfaces to be released: 0
----------------------------------
generation 0 has 9 finalizable objects (150a70a8->150a70cc)
generation 1 has 4 finalizable objects (150a7098->150a70a8)
generation 2 has 187422 finalizable objects (14ff0020->150a7098)
Ready for finalization 0 objects (150a70cc->150a70cc)
0x09489498    2,146       42,920 Foo.DataLayer.Doo
0x09488cd4    2,163       43,260 Foo.DataLayer.Daa
0x6523d7a0    2,146      120,176 System.Data.SqlClient.SqlConnection
0x6524534c    2,173      234,684 System.Data.DataView
0x65244194    4,368      419,328 System.Data.DataSet
0x04f9a32c   10,966      482,504 System.Threading.ReaderWriterLock
0x04f9a2d4   30,735      491,760 System.WeakReference
0x6746e70c   13,048    1,043,840 System.EnterpriseServices.ServicedComponentProxy
0x094850d0    2,176    1,584,128 Foo.BusinessLayer.All
0x65242d0c   10,957    3,243,272 System.Data.DataTable
0x65244ff8  100,264   14,839,072 System.Data.DataColumn
Total 187,435 objects, Total size: 22,721,440

Generation 2 には 187422 個のファイナライズ可能なオブジェクトがありますが、多すぎませんか??

!dae を実行すると、OutOfMemoryException が大量に発生します。

4

1 に答える 1

0

出力には、実際には 2 つの重要な数値があります。ファイナライズ可能なオブジェクトとは、ファイナライザーを持つ任意の型のインスタンスを意味します。これらの型の多くも実装されIDisposableDisposeが呼び出されると、ファイナライザーを実行せずにガベージ コレクションが行われます (Disposeが正しく実装されていると仮定します)。

もう一方の番号はファイナライズの準備ができています。これは、コレクションの前にファイナライザーを実行する必要があるオブジェクトの数です。出力では number は 0 なので、ここで心配する必要はありません。

そのOutOfMemoryException例外は、ランタイムによって事前に割り当てられているため、常にヒープに存在します。例外がスローされない場合は、これを気にする必要はありません。

于 2012-07-26T14:16:37.850 に答える