【问题标题】:How do I free memory faster?如何更快地释放内存?
【发布时间】:2019-08-01 23:23:42
【问题描述】:

我目前正在开发一个应用程序,我需要在其中搜索来自 REST API 服务的元素列表。但是每次我进行搜索时,内存使用量都会不断增加。

每次进行搜索时,我都会执行以下步骤: 1.我清理清单 2.我调用一个方法给我带来来自REST API的请求列表 2.我通过调用请求方法设置列表

myList.clear();
myList = GetListFromREST("https://myrestapi.com/itemList");

async Task<List<Item>> GetListFromREST(string url)
{
    List<Item> result;
    var response = await new RestService<Response>().GetDataAsyc(url);

    if (response.Error.StatusCode == 200)
    {
        result = response.Data;
    }
    else
    {
        throw ex;
    }
    return result;
}

根据内存诊断工具内存总是不断上升和上升。这对我来说没有意义,因为当我清除它时,它必须恢复。

【问题讨论】:

  • 除非你有内存问题,否则不要担心,但如果你真的想,不要分配那么多......事实上.net不会积极的垃圾收集并将内存归还给操作系统除非有需要
  • 附带说明,请始终尽可能使用using 语句。虽然这不会从本质上为您节省分配,但无论如何都是明智之举
  • response 是否实现了IDisposable
  • @mjwillis no,响应没有实现IDisposable

标签: c# list memory-management garbage-collection


【解决方案1】:

首先,性能咆哮:https://ericlippert.com/2012/12/17/performance-rant/ 只是为了确保甚至存在需要修复的问题。

关于内存消耗,有两个问题:

  1. measure reliably 真的很难。但是您的测量工具听起来确实更可靠。
  2. 您可能没有问题,只是 GC 正常工作。

您的内存由垃圾收集器管理。 GC 的工作需要时间,在此期间所有其他线程都必须停止。这也是在没有生产力乘数的情况下增加工作效率的方法,所以这只是你付出的代价。然而,由于性能影响,垃圾收集器不希望不必要地运行。事实上,如果它只在应用程序关闭时运行一次,那是理想的场景

除了显式调用或 OutOfMemory 异常的危险之外,其他任何事情都会使其更早运行。如果你真的遇到了 OOM,你可以确定一件事:所有可以收集的东西都已经收集了。

如果在这一切之后您仍然需要改进一些东西,那么像 .NET 这样的托管运行时可能是一个错误的起点。您可能甚至可以一路进入实时编程。但考虑到您是从 WEB API 检索数据,我想说的是,在 99.99% 的概率下,网络是瓶颈。

【讨论】:

    【解决方案2】:

    首先,请确保您有内存消耗问题。如果你运行你的代码片段 100 或 1000 次会怎样?消耗的内存水平会稳定还是不断增长?只有当它无限增长时,您才会遇到问题。

    如果您的内存消耗稳定在某个水平,您就没有内存泄漏,因此不应该“解决”这个问题。

    其次,在我看来,调用

    myList.Clear();
    

    没有任何意义。在下一行中,您为引用分配一个新值,因此如果系统中没有其他活动对象继续引用您的列表,则旧列表超出范围并且内存可以被 GC 回收。

    第三,每次调用 GetListFromREST 都会创建一个新的 RestService 对象实例。当方法返回时,该对象超出范围并且可以被回收,但无论如何您都会对 GC 造成一些压力。当然,GC 不会立即收集所有未使用的对象,因此即使对象很快超出范围,内存消耗也会增加。如果你的 RestService 在后台使用 HttpClient,你应该考虑让它保持活动状态,因为建议重用 HttpClient 对象而不是不断地重新创建。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      • 2018-07-30
      • 2011-01-31
      相关资源
      最近更新 更多