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