我们的 IIS 6.0 应用程序池在第一次加载 155Mb 内存页面时占用。在随后刷新同一页面时,消耗的应用程序池内存上升到大约 245Mb。
它是一个网络表单应用程序,使用实体框架和 DevExpress 控件。
起初我认为这是内存泄漏,但在使用内存分析器进行进一步调查后发现,应用程序池占用的空间中有一半以上是可用空间,但却是碎片化的。
这将矛头指向了大对象堆内存碎片作为罪魁祸首。确实有一个大约 980Kb 的长列表,这通常会导致碎片,尤其是当列表增长和调整大小时会在内存中留下漏洞。
所以我创建了一个复合列表,基本上是一个列表列表,其想法是因为每个列表都小于 85000 字节,它会被分配到在垃圾回收后被压缩的普通堆中(不像大对象堆,它永远不会被压实)
预计复合列表会像其他地方一样使用列表来确保对象逃离大对象堆,但在这种情况下它似乎没有任何真正的区别,并且应用程序池内存是仍然在 240Mb 左右,而内存分析器报告点网 CLR 内存在 10Mb 左右。
我计划进行内存转储以查看发生了什么,但只是想知道是否有人对可能的原因有看法。