Как я могу определить ненужные объекты .NET, которые не собирают мусор?

Мое приложение (C# .NET 4.0) работает в течение нескольких дней, обновляя смоделированный счет в соответствии с изменениями цен, полученных из базы данных SQLite.

Все, что мне нужно на любую конкретную дату - это счет в его текущем состоянии и последние цены. Я ожидал, что сборщик мусора будет поддерживать использование памяти на достаточно ровном уровне: то, что я наблюдаю, это постоянное увеличение рабочей и приватной памяти (как сообщает System.Diagnostics.GetCurrentProcess()), а также GC.GetTotalMemory(true): около 300K в день в этом случае. Неизбежно все это рушится примерно через 12 смоделированных лет, к этому моменту использование памяти увеличилось примерно на 1 ГБ.

Использование памяти увеличивается более или менее линейно, (гораздо более плавно, если я принудительно запускаю GC.Collect() в конце каждого дня).

Я делаю вывод, что некоторые объекты почему-то не собираются в мусор, даже когда я думаю, что в них больше нет необходимости, и ожидал, что они будут очищены в нормальном потоке выполнения.

Что я могу попытаться определить, где я случайно создал такую ситуацию?

Я скачал и запустил CLRProfiler - на переваривание документации уйдет лучшая часть выходных, хотя нет никакой гарантии, что она сможет помочь.

Я прорабатываю ссылки в этом вопросе. В целом, я знаю, какая ситуация может вызвать проблему, меня больше интересует, есть ли более быстрые способы определить специфику, не тратя драгоценные дни на проработку моего кода, отмечая ссылки...

ПРИМЕЧАНИЕ: Проблема, похоже, не связана с событиями, и в ней не задействован графический компонент.

6
задан Community 23 May 2017 в 11:59
поделиться