抛出异常的未等待任务的内存泄漏?
Memory leak on unawaited tasks which throw exception?
下面是一个简单的控制台应用程序代码,它反复触发异步调用但不等待。被调用函数抛出异常。
运行使用此控制台应用程序会产生以下结果:
- 在调试器下的 VS 中 - 内存使用率是平稳的。没有泄漏。
- 运行 直接执行 exe(在 vs 之外,而不是在调试器下)-内存不断增长到 gbs,最终 OOM 约为 ~4gb。
我不确定如何解释这些结果。任何帮助将不胜感激。
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 本身是一个对象这一事实。
当您调用 Task.Run() 时,您将一个任务添加到线程池的队列中。我敢打赌,内存泄漏是由于新任务不断被添加到线程池的队列中,而线程池无法跟上它。
下面是一个简单的控制台应用程序代码,它反复触发异步调用但不等待。被调用函数抛出异常。 运行使用此控制台应用程序会产生以下结果:
- 在调试器下的 VS 中 - 内存使用率是平稳的。没有泄漏。
- 运行 直接执行 exe(在 vs 之外,而不是在调试器下)-内存不断增长到 gbs,最终 OOM 约为 ~4gb。
我不确定如何解释这些结果。任何帮助将不胜感激。
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 本身是一个对象这一事实。
当您调用 Task.Run() 时,您将一个任务添加到线程池的队列中。我敢打赌,内存泄漏是由于新任务不断被添加到线程池的队列中,而线程池无法跟上它。