Утечка памяти на нежеланные задачи, которые выдают исключение? - PullRequest
0 голосов
/ 22 января 2019

Ниже приведен простой код консольного приложения, которое многократно запускает асинхронный вызов, но не ожидает.Вызываемая функция выдает исключение.Запуск этого консольного приложения дает следующие результаты:

  • В VS под отладчиком - использование памяти не меняется.Нет утечек.
  • Запустите exe-файл напрямую (вне vs и не под отладчиком) - память продолжает расти до ГБС и, в конечном итоге, OOM составляет около ~ 4 ГБ.

Я не уверенкак объяснить эти результаты.Любая помощь будет принята с благодарностью.

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

edit: Меня прежде всего интересует, почему утечка памяти происходит, когда ненаблюдаемые исключения генерируются постоянно.

1 Ответ

0 голосов
/ 22 января 2019

Когда вы постоянно создаете новые задачи с помощью этого Task.Run (), вы создаете новые объекты, которые занимают больше памяти. Я считаю, что вы упускаете из виду тот факт, что само задание является объектом.

Когда вы вызываете Task.Run (), вы добавляете задачу в очередь пула потоков. Могу поспорить, что утечка памяти происходит из-за новых задач, постоянно добавляемых в очередь пула потоков, и поток пула не может справиться с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...