我正在调查生产中的内存转储,我看到很多带有“Pinning handle”的引用,你可以在下面的截图中看到(来自Jetbrains dotMemory)。我们没有使用固定的,我们没有对这个代码的非托管资源做任何事情,所以我想问这怎么可能? SiteManager类是单例,所以有
private static SiteManager _instance;
代码中的字段,永远引用该对象。但我没有看到任何理由导致钉扎。
最有可能的是,对象数组是用于存储静态引用的内部CLR对象之一。所以它不是你的对象固定,它的数组保持静态参考固定。
[编辑]我说“最有可能”因为我不知道你的节目。如果你作为这个程序的作者,确定它不是“你的”object[],那肯定是一个数组保持“静态引用GC根”。
object[]
Here和here你可以读一点GC根源
但由于它似乎是内部的.NET实现细节,因此没有关于对象数组的信息。我从dotMemory开发人员的经验中了解到这一点。