0

我试图找出程序中的一些内存问题,我从压力测试中转储了内存,然后导入到.NET Memory Profiler,这对我来说似乎是一个非常奇怪的对象[],它只包含 92 个 String 实例位于LOH。

据我所知,只有具有大量元素的数组才会分配给 LOH,无论元素类型是什么,因为值类型和引用类型都只占用 4 个字节的内存地址。所以如果我们说 85K 是放在 LOH 上的最小尺寸,那么一个数组需要达到 85000/4 = 21000 个元素。

Profiler 说它在 LOH 上,抱歉,我无法显示仅当鼠标在该对象上时才会出现的单词 []

Profiler 说 #404,147 在 LOH 上 检查 92 个元素的详细信息。 列出了所有 object[] 元素,实例字节不大,我认为这完全不相关

4

1 回答 1

1

.NET 运行时使用 object[] 数组作为存储来实现静态字段,因此您在 LOH 上看到的 object[] 数组很可能用作静态字段的容器。

为了优化对静态字段的访问,运行时希望使用对该字段的直接内存访问,但由于该字段作为条目存储在托管数组中,因此通常可以在内存中移动该数组。为了防止字段存储移动,可以将 object[] 数组固定在内存中,但这会显着影响垃圾收集器的性能。相反,object[] 数组被分配在大对象堆中,即使它的大小比普通的大对象小得多。将数组放在大堆上也可以防止实例被移动,并为分代垃圾收集器提供好处。

于 2013-11-14T10:13:40.977 回答