Entity framework 为什么我们的IIS 6应用程序池占用的内存是CLR占用内存的十倍

Entity framework 为什么我们的IIS 6应用程序池占用的内存是CLR占用内存的十倍,entity-framework,memory,iis-6,fragmentation,large-object-heap,Entity Framework,Memory,Iis 6,Fragmentation,Large Object Heap,我们的IIS 6.0应用程序池在第一次加载页面155Mb内存时占用空间。在随后刷新同一页面时,应用程序池消耗的内存约为245Mb 它是一个webforms应用程序,使用实体框架和DevExpress控件 起初我认为这是内存泄漏,但在使用内存探查器进行进一步调查时发现,应用程序池占用的空间有一半以上是可用空间,但都是碎片 这就指出大对象堆内存碎片是罪魁祸首。确实有一个大约980Kb的长列表,它通常会导致碎片,特别是当列表增长并调整大小时,会在内存中留下漏洞 因此,我创建了一个复合列表,基本上是一个

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

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

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

这就指出大对象堆内存碎片是罪魁祸首。确实有一个大约980Kb的长列表,它通常会导致碎片,特别是当列表增长并调整大小时,会在内存中留下漏洞

因此,我创建了一个复合列表,基本上是一个列表列表,其思想是,由于每个列表小于85000字节,它将被分配到正常堆中,该堆在垃圾收集后被压缩(与大型对象堆不同,大型对象堆永远不会被压缩)

正如其他地方所读到的,其他人使用列表列表来确保对象脱离大型对象堆,但在这种情况下,它似乎没有产生任何实际影响,应用程序池内存仍在240Mb左右,而内存分析器报告的dot net CLR内存约为10Mb


我计划做一次内存转储,看看发生了什么,但我只是想知道是否有其他人对可能的原因有看法。

我愿意赌一大笔钱,你看到的是巨大的字符串占据了大对象堆中的块,这对于任何类型的部分呈现方案都是如此,这将包含要交付的html输出到浏览器

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

祝你好运!如果您想沿着这条路线走下去,您将考虑创建一组呈现扩展,这些扩展打开
响应流
并在计算内容时直接写入它们