引发异常的未等待任务的内存泄漏



下面是一个简单的控制台应用代码,它反复触发异步调用,但不等待。被调用的函数引发异常。运行此控制台应用会产生以下结果:

  • 在调试器下的 VS 中 - 内存使用量是平坦的。无泄漏。
  • 直接运行 exe(在 vs 之外而不是在调试器下) - 内存不断增长到 gbs,最终在 ~4gb 左右达到 OOM。

我不知道如何解释这些结果。任何帮助将不胜感激。

    static void Main(string[] args)
    {
        while (true)
        {
            Task.Run(() => RunMain());
        }
        Console.ReadLine();
    }
    static Exception ex = new Exception();
    private static void RunMain()
    {
        throw ex;
    }

编辑:我主要感兴趣的是为什么当连续抛出未观察到的异常时内存泄漏。

当你不断地用那个 Task.Run() 创建新任务时,你正在创建占用更多内存的新对象。我相信你忽略的是任务本身是一个对象的事实。

调用 Task.Run() 时,将任务添加到线程池的队列中。我敢打赌,内存泄漏是由于新任务不断添加到线程池的队列中,而线程池无法跟上它。

最新更新