Что на самом деле делает кнопка «Force G C» в Visual Studio Performance Profiler? - PullRequest
2 голосов
/ 29 января 2020

Я пытаюсь отследить утечки памяти в моем приложении с помощью Visual Studio Performance Profiler

. Я использую профилировщик для:

  1. выполнения действий
  2. Снимок
  3. Force G C
  4. снимок снова

И я вижу, что весь мой объектный мусор собран правильно.

enter image description here

Я делаю то же самое, но с помощью своего приложения:

  1. выполняю действия
  2. Снимок
  3. Force G C во время выполнения с использованием кода:

    GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect();

  4. снимок еще раз

Но на этот раз объекты не собраны и все еще находятся в памяти.

Так в чем же разница между кнопкой Force GC и кодом GC.Collect(), который я звоню?

1 Ответ

0 голосов
/ 29 января 2020

Итак, спасибо @Lass V. Karlsen за то, что он указал мне правильное направление с этим комментарием: Что на самом деле делает кнопка «Force G C» в Visual Studio Performance Profiler?

Это было совершенно очевидно, когда я об этом думал.

Мой Page избавлялся от самого себя и в Dispose методе I я вызывал:

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();

и, конечно, потому что в тот момент страница еще была жива и не собирала мусор.

Вместо этого я решил сделать следующее:

#if DEBUG
     Task.Run(async () =>
     {
         await Task.Delay(500);                   
         GC.Collect();
         GC.WaitForPendingFinalizers();
         GC.Collect();
     });
#endif

Обратите внимание, что я обернул ее DEBUG директива компилятора, так как я не думаю, что это рекомендуемый способ сделать это, но с целью выявления утечек памяти это работает хорошо

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