【问题标题】:Task Parallelism, memory management, and end of task任务并行、内存管理和任务结束
【发布时间】:2014-03-30 18:26:43
【问题描述】:

我有一个需要并行处理文件的进程,所以我正在尝试使用 .net 的任务库来完成此任务。我有一个类以静态方法执行任务,如下所示:

Task.Factory.StartNew(
() => FileProcessor.ProcessAFile(new FileInfo(e.FullPath)));

问题在于,一旦静态方法完成,似乎永远不会释放线程或永远不会回收内存。该方法正在执行一些图像处理,因此会占用大量内存,并且我观察到该进程在趋于平稳之前消耗了大约 1 GB 的内存。这是 ThreadPool 在幕后工作并确定 1 GB 是适当的内存量,还是我有更深层次的内存泄漏问题?

【问题讨论】:

  • “在它趋于平稳之前。”是你的答案。 ThreadPool 和任务都与内存管理无关——由 GC 决定何时收集内存以及使用多少内存。
  • 如果在 Task 完成后你一直持有对它的引用,GC 可能永远没有机会按照你期望的方式完成它的工作。

标签: c# .net multithreading memory task-parallel-library


【解决方案1】:

我认为生成 1GB 内存需要相当长的时间,因此 GC 可能将此数据移至第二代/第三代,它们的检查频率低于第一代,因此数据需要有时间被收回。这可能不是内存泄漏问题,因为正如您所提到的,它最终会趋于平稳。

您可以通过调用GC.Collect 来加快该过程,这将迫使GC 立即从所有代中收集数据。在调用Collect 方法之前,您需要确保对该数据块的所有引用都已清空。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 2015-05-16
    • 2022-01-26
    相关资源
    最近更新 更多