Я написал .NET-приложение, в котором использование памяти растет со временем.В качестве теста я настроил его на загрузку файлов размером 800 * 5K (среднего) и преобразование XML и использование DTComcontroller для генерации манифеста в течение 1 часа с интервалом в 15 минут.В течение примерно 5 часов объем используемой памяти увеличивается с 35 до 70 млн.
Не уверен, нормально это или нет.Я уже заставляю это делать
GC.collection();
GC.WaitForPendingFinalizers();
в конце каждого рабочего цикла, просто чтобы убедиться, что память освобождается своевременно.
Я уже проверяю закрытие дескриптора файла, очисткапоток или другие ресурсы после его использования.И некоторые объекты просто используют локальные ссылки внутри функции, и я предполагаю, что они будут отброшены в конце локальной функции и уйдут с GC.collction ().
Также Memory Profiler (ANTS) показывает, что естьне осталось объектов с пространством имен моего приложения в конце каждого рабочего круга, а также не осталось новых объектов с доступным исходным кодом.Новые экземпляры объектов, создаваемых во время каждого рабочего цикла, в основном называются RuntimeModule, RuntimeAssembly и DeviceContext.Похоже, я ничего не могу с этим поделать?
По сути, это мое первое приложение, которое должно работать 24/7, и я действительно мало что знаю о утечке памяти.Скорее всего, в моем приложении все еще есть проблемы с использованием памяти.Я просто не знаю, где искать этот этап.
Кроме того, я не знаю, связано это или нет, я использую .net Trace / debug для ведения журнала.Думаю, стоит попытаться отключить журнал, чтобы увидеть рост использования памяти.
Обновление:
Доза выглядит как круговая ссылка sslstate и sslstream, а также других классов в классе Reference Explorer.Также не уверен, что это круговая ссылка в сгенерированном графе ANTS, это означает, что в моем коде где-то есть круговая ссылка?
Я сделал несколько изменений, повторно используя один и тот же объект для создания XMLtransform и Manifest, и вручнуюустановите каждый объект равным нулю после окончания использования их в конце рабочей итерации.Теперь память значительно уменьшена, все еще увеличивается использование частной памяти, поскольку она работает, но очень медленно.
Я думаю, что для моего конкретного случая - создайте много объектов внутри рабочего круга, и все данные будут храниться врабочая нить.Если я не освобождаю ссылки на объекты в явном виде, пусть .NET GC сделает это, что приведет к большому объему памяти, используемой приложением, поскольку оно продолжает работать большую часть времени, и GC, возможно, никогда не получит шанс заняться домашним хозяйством, если толькоприложение было закрыто вручную, я должен сделать выпуск объекта намного более вручную.
@WeNeedAnswers:
XmlDocument doc = new XmlDocument();
XmlTextReader textReader = new XmlTextReader(dataFile);
textReader.Read();
doc.Load(textReader);