Мое приложение (C# .NET 4.0) работает в течение нескольких дней, обновляя смоделированный счет в соответствии с изменениями цен, полученных из базы данных SQLite.
Все, что мне нужно на любую конкретную дату - это счет в его текущем состоянии и последние цены. Я ожидал, что сборщик мусора будет поддерживать использование памяти на достаточно ровном уровне: то, что я наблюдаю, это постоянное увеличение рабочей и приватной памяти (как сообщает System.Diagnostics.GetCurrentProcess()
), а также GC.GetTotalMemory(true)
: около 300K в день в этом случае. Неизбежно все это рушится примерно через 12 смоделированных лет, к этому моменту использование памяти увеличилось примерно на 1 ГБ.
Использование памяти увеличивается более или менее линейно, (гораздо более плавно, если я принудительно запускаю GC.Collect()
в конце каждого дня).
Я делаю вывод, что некоторые объекты почему-то не собираются в мусор, даже когда я думаю, что в них больше нет необходимости, и ожидал, что они будут очищены в нормальном потоке выполнения.
Что я могу попытаться определить, где я случайно создал такую ситуацию?
Я скачал и запустил CLRProfiler - на переваривание документации уйдет лучшая часть выходных, хотя нет никакой гарантии, что она сможет помочь.
Я прорабатываю ссылки в этом вопросе. В целом, я знаю, какая ситуация может вызвать проблему, меня больше интересует, есть ли более быстрые способы определить специфику, не тратя драгоценные дни на проработку моего кода, отмечая ссылки...
ПРИМЕЧАНИЕ: Проблема, похоже, не связана с событиями, и в ней не задействован графический компонент.