.Net内存分析器和<gchandle>固定</gchandle>

时间:2012-04-27 01:51:53

标签: c# .net memory-leaks memory-profiling

我正在使用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

看起来它刚刚结束了一个空列表的构建。当根路径中没有实例并且我看到的所有内容都是Pinned时,它是什么意思?

1 个答案:

答案 0 :(得分:3)

原因是List静态构造函数分配了一个空的T数组。使用Reflector查看其代码:

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