Chu*_*huu 9 c# garbage-collection windbg
我正在尝试追踪与垃圾收集相关的性能问题,一个症状是"Promoted Finalization-Memory from Gen0"计数器显示了大量的对象,并且正在创建终结器并在完成Gen 0之后每个Gen0系列.
我怎样才能发现这些物体是什么?
您可以使用WinDbg,使用SOS扩展名来查找所包含的对象Gen 0.
将WinDbg附加到您的.NET应用程序并加载SOS - 这是一个方便的提示,可在此处找到:
http://www.wintellect.com/blogs/jrobbins/automatically-load-the-right-sos-for-the-minidump
基本上键入以下命令:
!analyze –v
这应该为您下载正确的SOS.DLL文件.如果失败,您可以运行以下两个命令:
.loadby sos clr
要么
.loadby sos mscorwks
我忘了应该使用哪一个(如果.NET应用程序是.NET 4.0及更高版本,我认为你需要第一个),但尝试两者.接下来,尝试以下命令!dumpheap:
!dumpheap -gen 0
这应该显示所有对象的列表Gen 0.这有希望对你有所帮助.
编辑:
这是一段YouTube视频,展示了如何使用WinDbg调试.NET应用:
https://www.youtube.com/watch?v=yVzNrz1jJHU
另一种方法是使用finalizequeueSOS 提供的命令。这显示了所有注册完成的对象,而不仅仅是那些准备完成的对象:
0:010> !finalizequeue
SyncBlocks to be cleaned up: 0
Free-Threaded Interfaces to be released: 0
MTA Interfaces to be released: 0
STA Interfaces to be released: 0
----------------------------------
generation 0 has 33 finalizable objects (000000001b2b9710->000000001b2b9818)
generation 1 has 2 finalizable objects (000000001b2b9700->000000001b2b9710)
generation 2 has 580 finalizable objects (000000001b2b84e0->000000001b2b9700)
Ready for finalization 0 objects (000000001b2b9818->000000001b2b9818)
Statistics for all finalizable objects (including all objects ready for finalization):
MT Count TotalSize Class Name
000007feebb95cb8 1 24 System.Threading.OverlappedDataCache
000007feebb81168 1 24 System.LocalDataStoreHolder
000007feebb14630 1 24 System.Threading.TimerHolder
000007feebb63a38 1 32 Microsoft.Win32.SafeHandles.SafePEFileHandle
000007feebb5ae38 1 32 Microsoft.Win32.SafeHandles.SafeFileMappingHandle
000007feebb5ada8 1 32 Microsoft.Win32.SafeHandles.SafeViewOfFileHandle
...<snip>...
Total 615 objects
Run Code Online (Sandbox Code Playgroud)
然后,您可以转储第 1 代内存范围中的所有对象(剪掉末尾,因为它不包含在内)。幸运的是,我这里的第一代只有两个:
0:010> dd 000000001b2b9700 000000001b2b9710-4
00000000`1b2b9700 02d51da0 00000000 02d51d50 00000000
Run Code Online (Sandbox Code Playgroud)
然后转储这些对象(这只是第一个):
0:010> !do 02d51da0
Name: System.WeakReference
MethodTable: 000007feebb6cbb0
EEClass: 000007feeb53f1d8
Size: 24(0x18) bytes
File: C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
Fields:
MT Field Offset Type VT Attr Value Name
000007feebb6a338 4000688 8 System.IntPtr 1 instance 2128d8 m_handle
Run Code Online (Sandbox Code Playgroud)