【问题标题】:Why are our IIS 6 Application pools taking up ten times the memory being consumed by the CLR为什么我们的 IIS 6 应用程序池占用的内存是 CLR 消耗的内存的十倍
【发布时间】:2013-06-05 13:22:32
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: entity-framework memory iis-6 fragmentation large-object-heap


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-13
      • 1970-01-01
      • 2016-06-30
      • 2014-05-15
      • 2017-11-26
      • 2019-08-05
      相关资源
      最近更新 更多