.NET 内存分析器和 <GCHandle> 固定指针

3
我正在使用Scitech的.Net内存分析器检查我的应用程序(在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个回答

3
原因是List的静态构造函数会分配一个空的T类型数组。使用反射器查看其代码:

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

我有同样的问题(但对我来说,无论我勾选或取消“仅显示包含在根路径中的实例”复选框,我总是得到一个类似于 {Pinned} <GCHandle> -> Object[] -> SomeArray[] 的根路径,当我创建一个新的 List<T> 时 - 为什么会在这种情况下使用静态 List 构造函数?? - leozilla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接