0

我们的IIS 6.0应用程序池占用了一页155Mb内存的第一个负载。在随后刷新同一页面时,所消耗的应用程序池内存达到约245Mb。为什么我们的IIS 6应用程序池占用CLR消耗的内存的十倍

它是一个webforms应用程序,并使用实体框架和DevExpress控件。

起初我以为这是一个内存泄漏,但在使用内存分析器进一步调查发现,在采取一半的空间了由应用程序池是自由空间,但支离破碎。

这指出了手指朝向大对象堆内存碎片的罪魁祸首。确实有大约980Kb的长列表,通常会导致碎片化,特别是当列表增长并调整大小时留下内存空洞。

所以我创建了一个复合列表,基本上是一个列表列表,这个想法是,每个列表将在85000字节以下,它将被分配在垃圾收集后被压缩的普通堆中(不像Large对象堆,从来没有得到压缩)

本来料想的复合列表做的伎俩在别处读取,其他人已经使用列表清单,以确保对象转义大对象堆,但它似乎没有做任何在这种情况下真正的区别在于,应用程序池内存仍然在240Mb左右,而内存分析器报告的净点CLR内存在10Mb左右。做内存转储

我打算看看怎么回事,只是想知道,如果其他人有什么可能是可能的原因的视图。

回答

0

我愿意打赌的大量金钱那是你看到的是占据了大对象堆块巨型琴弦 - 这是任何种类的部分呈现方案尤其如此 - 其中将包含HTML输出即将被传送到浏览器。

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

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

相关问题