【问题标题】:.Net memory profiler and <GCHandle> pinned.Net 内存分析器和 <GCHandle> 固定
【发布时间】:2012-04-27 01:51:52
【问题描述】:

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

看起来它刚刚结束了一个空列表的构造。当根路径中不包含任何实例并且我看到的只是固定时,这意味着什么?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我有同样的问题(但对我来说,如果我选中/取消选中“仅显示根路径中包含的实例”复选框并不重要,我总是得到像 {Pinned} 这样的根补丁-> Object[] -> SomeArray[] 当我创建一个新的 List - 为什么在这种情况下使用静态 List 构造函数??
    猜你喜欢
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 2010-11-06
    • 1970-01-01
    • 2020-07-31
    • 2010-09-08
    • 1970-01-01
    相关资源
    最近更新 更多