В настоящее время я работаю над веб-сайтом, который широко использует кэшированные данные, чтобы избежать обходов.При запуске мы получаем «большой» график (сотни тысяч различных типов объектов).Эти объекты извлекаются через WCF и десериализуются (мы используем буферы протокола для сериализации). Я использую профилировщик памяти redgate для устранения проблем с памятью (кажется, что память не соответствует тому, сколько памяти нам нужно «после», когда мы закончим)Инициализация и создание этого отчета
Теперь мы можем получить из этого отчета следующее:
1) Большая часть выделенной памяти .NET свободна(возможно, он был правильно выделен во время десериализации, но теперь, когда он свободен, я бы хотел, чтобы он вернулся в ОС)
2) Память фрагментирована (что плохо, поскольку каждый раз, когда я обновляю наличные деньги)мне нужно повторить процесс десериализации, требующий памяти, и это, в свою очередь, создает большой объект, который может вызвать исключение OutOfMemoryException из-за фрагментации)
3) Я понятия не имею, почему пространство фрагментировано, потому что, когда я смотрю накуча больших объектов, всего 30 экземпляров, 15 объектов [] напрямую подключены к ГХ и совершенно не связаны со мной, 1 являетсямассив char также подключен непосредственно к GC Heap, остальные 15 принадлежат мне, но не являются причиной этого, поскольку я получаю тот же отчет, если закомментирую их в коде.
Поэтому мой вопрос: что я могусделать, чтобы пойти дальше с этим?Я не совсем уверен, что искать в отладке / инструментах, так как кажется, что моя память фрагментирована, но не мной, и .net выделяет огромное количество свободного места, которое я не могу освободить.
Также, пожалуйста, убедитесь, что вы хорошо поняли вопрос, прежде чем ответить, я не ищу способ освободить память в .net (GC.Collect), но чтобы освободить память, которая уже свободна в .net, для системы кака также для дефрагментации упомянутой памяти.
Обратите внимание, что медленное решение - это хорошо, если можно вручную дефрагментировать большую кучу, я бы все для этого, как я могу вызвать его в конце RefreshCache, и это нормальноесли для запуска требуется 1 или 2 секунды.
Спасибо за вашу помощь!
Несколько замечаний, которые я забыл: 1) Проект представляет собой веб-сайт .net 2.0, я получаю те же результатыв пуле .net 4, то есть, если я запустил его в пуле .net 4, преобразовал в .net 4 и перекомпилировал.
2) Это результаты сборки выпуска, поэтому отладочная сборка не можетбыть проблемой.
3) И это яЭто, вероятно, очень важно, я вообще не получаю эти проблемы на сервере webdev, только в IIS, в webdev потребление памяти довольно близко к моему фактическому потреблению (ну, больше, но не в 5-10 раз больше!)