我正在调查生产中的内存转储,我看到很多引用“固定句柄”,如下面的屏幕截图(来自 Jetbrains dotMemory)所示。我们没有使用 fixed 并且我们没有对这段代码周围的非托管资源做任何事情所以我想问一下这怎么可能? SiteManager 类是单例的,所以有
private static SiteManager _instance;
代码中的字段,它永远保持对该对象的引用。但我看不出这会导致固定的任何原因。
最佳答案
对象数组很可能是用于存储静态引用的内部 CLR 对象之一。所以它不是固定的对象,它是固定静态引用的数组。
[编辑]
我说“很有可能”是因为我不知道你的程序。作为该程序的作者,如果您确定它不是“您的”object[]
,那么可以肯定它是一个保持“静态引用 GC 根”的数组。
Here和 here你可以阅读一些关于 GC roots 的内容
但是没有关于对象数组的内容,因为它似乎是内部 .NET 实现细节。我从我作为 dotMemory 开发人员的经验中了解到这一点。
关于c# - 内存转储中的 .NET Pinning 句柄没有互操作性或已修复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55146060/