2012-07-26 59 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該異常總是出現在堆上,因爲它是由運行時預先分配的。如果不拋出異常,則不必擔心這一點。