2012-07-26 65 views
0

我在WinDbg中运行的finalize队列命令,我得到了以下结果:Asp.Net调试使用WinDbg的/ PSSCOR2

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。

回答

0

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

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

至于OutOfMemoryException该异常总是出现在堆上,因为它是由运行时预先分配的。如果不抛出异常,则不必担心这一点。