2012-04-27 5 views
3

Я использую Profit Profit Profit Profibit для проверки некоторых вещей в своем приложении (работает на WinXP 64). Я вижу много случаев, когда есть один живой экземпляр списка, которое использует мое приложение, которое всегда 32 байта и отображается как массив (например, Products []).. Профилировщик памяти .Net и <GCHandle> pinned

Когда я более подробно рассмотрю экземпляр, он не выглядит так, как будто на что-то ссылается. Если я поставлю флажок «Только экземпляры экземпляров, включенных в корневые пути», список ссылок по умолчанию пуст. Если я снимите этот флажок, я вижу только:

Object[] #307[9126] 
    <GCHandle> #306 {Pinned} 

Распределения стек вызовов выглядит следующим образом:

mscorlib!System.Collections.Generic.List<T>..cctor() 
[Skipped frame(s)] 
mscorlib!System.Collections.ObjectModel.Collection<T>..ctor() 
MyApp.ProductsAdmin!MyApp.ProductsAdmin.ViewModels.ProductsAdminViewModel..ctor() ProductsAdminViewModel.cs 

Похоже, его просто заканчивается на строительстве пустого списка. Что это означает, когда нет экземпляров, включенных в корневые пути, и все, что я вижу, является Pinned?

ответ

3

Причина заключается в том, что список статический конструктор выделить пустой массив T. Посмотрите на его код с помощью отражателя:

static List() 
{ 
    List<T>._emptyArray = new T[0]; 
} 
+0

У меня такая же проблема (но для меня это не имеет значения, если я проверить/снимите флажок в «Показывать только экземпляры, включенных в корневых путях» флажок, я всегда получаю корневой патч, как {Закрепленные} -> Object [] -> SomeArray [] когда я создать новый список - почему статический список конструктор, используемый в этом случае? – leozilla