【问题标题】:Cleaning up large Objects from IIS Memory从 IIS 内存中清理大对象
【发布时间】:2014-10-26 16:40:16
【问题描述】:

我有一个将数据表存储在内存缓存 (AppFabric) 中的应用程序。这些数据表可能非常大。一旦我们的应用程序(MVC 站点)产生大量流量,IIS 的内存使用量就会很快达到顶峰。

理想情况下,我们希望能够释放这些 DataTables 从缓存中请求后消耗的内存。

控制器的代码类似于

Using (DataTable dt = DataTable)
{
    DataTable dt = Cache.GetObject(objectID);

    //perform some manipulation on Data table
    DataTable dtSmaller = dt.Select("Select top 1...");

   dt.Dispose();
}   
    //return from controller
return dtSmaller;

一旦这个控制器被多次点击,W3WP.exe 进程就会使用大量内存,直到最终内存不足。发生的事情是 DataTable 来自缓存,它被查询以减少输出数据的大小。然后我处理原始的 DataTable。

我正在寻找一种方法来释放 DataTable 消耗的内存,而不依赖于 IIS 垃圾收集

【问题讨论】:

  • 你不负责释放内存,而是垃圾收集器。为什么不使用数据库?
  • 数据来自第三方基于云的网络服务。
  • 我还是不明白是什么消耗了这么多内存。您的缓存似乎包含一个大的DataTable。但是这个尺寸是固定的,应该不是问题。那么大量较小的表是否会导致此内存问题?我不能相信。 dt.Select("Select top 1..."); 实际上在做什么,因为那不是有效的语法?您可以使用 LINQ:dt.AsEnumerable().Take(10),它不需要始终创建新的 DataRow[]。所以不要返回DataTable,而是返回IEnumerable<DataRow>
  • 选择仅用于演示。基本上,它在数据表上运行查询并返回一小部分数据。缓存是一个不同的应用程序(MS App Fabric)。一旦 IIS 进程从缓存中读取 DataTable,它就会创建一个本地副本。对控制器的每个请求似乎最终都会使用所有可用内存创建越来越多的本地副本。
  • 缓存还可以包含许多不同的数据表。

标签: c# caching iis memory datatable


【解决方案1】:

您可以通过调用 GC.GetTotalMemory(true) 来强制执行完整的垃圾回收周期

更多方法信息:GC.GetTotalMemory

【讨论】:

  • 我认为通过强制 GC 和使用 Wea​​kReferences 的组合,我应该能够实现我想要的。
猜你喜欢
  • 2010-12-04
  • 2016-04-25
  • 1970-01-01
  • 2023-03-12
  • 2011-02-22
  • 1970-01-01
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多