Использование System.Runtime.Caching.MemoryCache в ASP. NET потребляет память - PullRequest
0 голосов
/ 10 февраля 2020

Я использую MemoryCache в моем приложении asp. net. После того, как мое приложение работает в течение нескольких часов, процесс w3wp потребляет столько памяти, что может достигать 10 гигабайт памяти, и после этого приложение перестает отвечать на запросы и IIS сбрасывает его автоматически (с помощью механизма ping).

Я профилировал процесс приложения и обнаружить, что MemoryCache создает несколько экземпляров MemoryCacheStore внутри (равно числу процессоров), и каждый экземпляр занимает много памяти!

кажется, что по какой-то причине MemoryCache хранит одни и те же данные в нескольких экземплярах, и это приводит к огромному потреблению памяти.

Как вы видите на следующем изображении, у меня 16 процессоров и 16 из MemoryCacheStore внутренне создается одним MemoryCache экземпляр. Я проверил исходный код MemoryCache и обнаружил, что он создает массив MemoryCacheStore из Environment.Processors count, но не обнаружил, почему все эти экземпляры объединяют память и как это предотвратить? enter image description here

// как я использую кеш

_requestCache.Get(key, () =>
        {
            var query = _categoryRepository.Table;

            if (!showHidden)
                query = query.Where(c => c.Published);

            query = query.Where(c => c.ParentCategoryId == parentCategoryId && !c.Deleted);

            query = ApplyHiddenCategoriesFilter(query, storeId, showHidden);

            var categories = query.OrderBy(x => x.DisplayOrder).ToList();
            return categories;
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...