0

我们的 IIS 6.0 应用程序池在第一次加载 155Mb 内存页面时占用。在随后刷新同一页面时,消耗的应用程序池内存上升到大约 245Mb。

它是一个网络表单应用程序,使用实体框架和 DevExpress 控件。

起初我认为这是内存泄漏,但在使用内存分析器进行进一步调查后发现,应用程序池占用的空间中有一半以上是可用空间,但却是碎片化的。

这将矛头指向了大对象堆内存碎片作为罪魁祸首。确实有一个大约 980Kb 的长列表,这通常会导致碎片,尤其是当列表增长和调整大小时会在内存中留下漏洞。

所以我创建了一个复合列表,基本上是一个列表列表,其想法是因为每个列表都小于 85000 字节,它会被分配到在垃圾回收后被压缩的普通堆中(不像大对象堆,它永远不会被压实)

预计复合列表会像其他地方一样使用列表来确保对象逃离大对象堆,但在这种情况下它似乎没有任何真正的区别,并且应用程序池内存是仍然在 240Mb 左右,而内存分析器报告点网 CLR 内存在 10Mb 左右。

我计划进行内存转储以查看发生了什么,但只是想知道是否有人对可能的原因有看法。

4

1 回答 1

0

我愿意赌一大笔钱,你所看到的是巨大的字符串占据大对象堆中的块 - 对于任何类型的部分渲染方案尤其如此 - 这将包含要成为的 html 输出传送到浏览器。

我之前遇到过这个确切的问题,但解决方案很痛苦 - 基本上我必须经历并创建一个“流式写入”路径,而不是标准的“将控件/视图的所有 html 输出聚合在一起”方法,即(或至少是)MVC、WebForms 等的默认方法。

祝你好运!如果你想走这条路,你会考虑创建一组渲染扩展,打开Response流并在计算内容时直接写入它们。

于 2013-06-28T17:37:26.840 回答