内存转储中的 .NET Pinning 句柄没有互操作性或已修复

.NET Pinning handle in memory dump with no interop or fixed

我正在调查生产中的内存转储,我看到很多关于 "Pinning handle" 的引用,如下面的屏幕截图(来自 Jetbrains dotMemory)所示。我们没有使用 fixed 并且我们没有对这段代码周围的非托管资源做任何事情所以我想问一下这怎么可能? SiteManager class 是单例,所以有

private static SiteManager _instance;

代码中的字段,它永远保持对该对象的引用。但我看不出这会导致固定的任何原因。

对象数组很可能是用于存储静态引用的内部 CLR 对象之一。所以它不是你的固定对象,它是保持固定静态引用的数组。

[编辑] 我说 "most likely" 因为我不知道你的程序。如果你,作为这个程序的作者,确定它不是 "your" object[],那肯定它是一个保持 "static reference GC root" 的数组。

Here and here 你可以阅读一些关于 GC roots 的内容

但似乎没有关于对象数组的内容,因为它似乎是内部 .NET 实现细节。我是根据我作为 dotMemory 开发人员的经验了解到的。