System.Runtime.Caching.MemoryCache - это класс в .NET Framework (версия 4+), который кэширует объекты в памяти, используя строки как ключи. Более System.Collections.Generic.Dictionary<string, object>, этот класс имеет все виды колоколов и свистов, которые позволяют вам настроить, насколько большой кеш может вырасти до (в абсолютном или относительном выражении), установить разные политики истечения срока действия для разных элементов кэша и многое другое.Что означают ограничения памяти MemoryCache?
Мои вопросы касаются пределов памяти. Ни один из документов на MSDN, по-видимому, не объясняет это удовлетворительно, а код в Reference Source довольно непрозрачен. Извините, что все это свалило в один «вопрос», но я не могу понять, как взять некоторые из них в свои собственные вопросы, потому что они действительно просто разные взгляды на один общий вопрос: «Как вы примирите идиоматический C#/.NET с понятием общего полезного кеша в памяти, который имеет настраиваемые пределы памяти, которые практически полностью реализованы в управляемом коде? "
- Учитываются ли размеры ключей в пространстве, которое считается MemoryCache? Как насчет ключей в станем пуле, каждый из которых должен только добавить размер ссылки на объект к размеру кеша?
- Учитывает ли MemoryCache больше, чем размер ссылок на объекты, которые он хранит при определении размера объекта, хранящегося в пуле? Я имею в виду ... он должен, не так ли? В противном случае параметры конфигурации крайне вводят в заблуждение для обычного случая ... для остальных вопросов я предполагаю, что это так.
- Учитывая, что MemoryCache почти наверняка считает больше, чем размер ссылок на объекты значений, хранящихся в кеше, насколько он глубоко уходит?
- Если я реализовывал что-то вроде этого, я нашел бы очень трудно рассмотреть использование памяти «дети» члены отдельных объектов, не также вытягивать в «родительских» эталонных свойствах.
- например, представьте себе класс в игровом приложении,
Player
.Player
имеет какое-то определенное для игрока состояние, которое инкапсулировано в свойствоpublic PlayerStateData PlayerState { get; }
, которое инкапсулирует, в каком направлении находится игрок, сколько звездочек они держат и т. Д., А также ссылку на состояние всей игрыpublic GameStateData GameState { get; }
, которые могут быть использованы для получения обратно в состояние игры (намного больше) из метода, который знает только об игроке. - Учитывает ли MemoryCache как
PlayerState
, так иGameState
при рассмотрении размера вклада в кеш? - Возможно, это больше похоже на «что такое всего размер на управляемой куче, занятой объектами, непосредственно хранящимися в кеше, и все, что доступно через члены этих объектов»?
- Кажется, было бы глупо умножать размер вклада
GameState
на лимит на 5 только потому, что 5 игроков кэшированы ... но опять же, вероятная реализация может сделать именно это, и это сложно подсчитатьPlayerState
без учетаGameState
.
- Если объект хранится несколько раз в MemoryCache, каждая запись подсчитывается отдельно до предела?
- Связано с предыдущим, если объект хранится непосредственно в MemoryCache, но также косвенно через членов другого объекта, какое влияние оказывает либо на ограничение памяти?
- Если объект хранится в MemoryCache, но также ссылается на некоторые другие живые объекты, полностью отключенные от MemoryCache, какие объекты подсчитываются против предела памяти? А если это массив объектов, некоторые (но не все) из которых имеют входящие внешние ссылки?
Мои собственные исследования привели меня к SRef.cs, который я дал на попытке понять после получения here, который впоследствии приводит here. Угадав ответы на все эти вопросы, он будет вращаться вокруг поиска и медитации на коде, который, в конечном счете, заполняет INT64, который хранится в этом дескрипторе.
IMO самая полезная реализация обработки предельных значений MemoryCache предполагает, что кэш может отлично ответить на вопрос: «Если бы я был очищен и после этого был запущен полный GC, то сколько байтов памяти было бы освобождено во время этого запуска GC ?» Но чем больше я думаю об этом, тем больше ожидаю, что его ответ будет сильно раздутым, если владелец кеша не соблюдает определенный набор нераскрытых (или, по крайней мере, неоткрытых) правил, поэтому это имеет значение не только для теоретические причины. –
Я пришел сюда, задавая точно такие же вопросы, особенно в отношении ссылок на общее состояние. Другой вопрос также преследует меня ... если ваш кеш-объект (граф) растет или сжимается после того, как он был помещен в кеш ...? Все это довольно расплывчато. – spender