0

我在 windbg 中运行 finalize queue 命令,得到以下结果:

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

第 2 代有 187422 个可终结对象,是不是太多了?

运行 !dae 时,我看到很多 OutOfMemoryException。

4

1 回答 1

0

输出中实际上有两个重要的数字。可终结对象是指具有终结器的任何类型的实例。许多这些类型也将实现IDisposable,如果Dispose被调用,那么它们将在不运行终结器的情况下被垃圾收集(假设Dispose正确实现)。

另一个号码已准备好敲定。这是在收集之前必须为其运行终结器的对象的数量。在输出中该数字为 0,所以这里没有什么可担心的。

至于OutOfMemoryException该异常始终存在于堆上,因为它是由运行时预先分配的。如果没有抛出异常,您不必担心这一点。

于 2012-07-26T14:16:37.850 回答