Я пытаюсь понять, насколько реально попытаться точно определить, что существует потенциальная утечка памяти в блоке управляемого кода .NET программным путем. Причиной для этого было бы изолировать некоторый блок кода, который выглядит как утечка памяти, и затем использовать стандартный профилировщик для дальнейшего определения фактической причины утечки. В моем конкретном случае я бы загружал сторонний класс, который расширяет один мой класс, чтобы проверить его на наличие утечек.
Подход, который первым приходит на ум, выглядит примерно так:
- Подождите, пока запустится GC.
- Получить текущую выделенную память от ГХ.
- [Выполнить блок управляемого кода.]
- Подождите, пока запустится GC.
- Получить текущую выделенную память из ГХ и вычесть из выделенной памяти, записанной перед запуском блока кода. Верно ли, что теоретически разница должна быть (около) 0, если все объекты, размещенные в блоке кода, который был выполнен, были разыменованы соответствующим образом и собраны?
Конечно, непосредственная проблема в этом заключается в том, что там, скорее всего, будут ждать ... и ждать ... и ждать запуска недетерминированного GC. Если мы пропустим этот аспект, вычисление для определения того, утек ли блок кода какую-либо память, однако может сильно отличаться и не обязательно будет точным, поскольку некоторые элементы, возможно, не были собраны в то время.
Вышеупомянутое кажется мне лучшим вариантом, когда я пытаюсь определить, достаточно ли точно блок памяти имеет утечку памяти? Или есть другие методы работы, которые используются в реальной жизни? Спасибо.