Профилировщик памяти.Net и <GCHandle> закреплены
Я использую Scitech.Net Memory Profiler для проверки некоторых вещей в моем приложении (работает на WinXP 64). Я вижу много случаев, когда существует одно действующее представление списка, которое мое приложение использует, которое всегда составляет 32 байта и отображается в виде массива (например, Products[]).
Когда я более внимательно смотрю на экземпляр, это не похоже на то, что на него ссылаются. Если оставить флажок "Показывать только экземпляры, включенные в корневые пути", список, на который ссылается список, будет пустым. Если снять этот флажок, я вижу только:
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
Похоже, это только что закончилось на построении пустого списка. Что это значит, когда в корневых путях нет экземпляров, и все, что я вижу, это закреплено?
1 ответ
Причина в том, что статический конструктор List выделяет пустой массив T. Посмотрите на его код, используя Reflector:
static List()
{
List<T>._emptyArray = new T[0];
}