System.Runtime.Caching.MemoryCache是.NET Framework(版本4+)中的一个类,它使用字符串作为键,在内存中缓存对象。与System.Collections.Generic.Dictionary<string, object>不同,该类具有各种各样的功能,让您可以配置缓存可以增长多大(无论是绝对还是相对),为不同的缓存项设置不同的过期策略等等。
我的问题与内存限制有关。 MSDN上的文档似乎都没有令人满意的解释,而Reference Source上的代码也相当晦涩。抱歉将所有这些内容堆叠在一个SO“问题”中,但我无法想出如何将一些问题分离成自己的问题,因为它们实际上只是一个总体问题的不同视图:“如何将惯用的C#/.NET与通用的可配置内存限制的有用内存缓存相协调?”
- MemoryCache占用的空间是否包括密钥大小? 对于内部池中的密钥,每个密钥只应将对象引用的大小添加到缓存的大小中,是这样吗?
- 当确定在池中存储的对象的大小时,MemoryCache是否考虑存储的对象引用之外的更多因素? 我的意思是...它必须这样做,对于常见情况,否则配置选项会极其误导......对于其余的问题,我将假设它确实这样做。
- 鉴于MemoryCache几乎肯定会考虑缓存中存储的值的大小超出对象引用的大小,它有多深?
- 如果我要实现类似于此的东西,我会发现很难考虑单个对象的“子”成员的内存使用情况,而不会同时引入“父”引用属性。
- 例如,在游戏应用程序中有一个类Player。 Player具有一些特定于玩家的状态,封装在公共PlayerStateData PlayerState {get;}属性中,该属性封装了玩家朝向,他们持有的螺栓数量等信息,以及对整个游戏状态的引用public GameStateData GameState {get;},可以从仅知道玩家的方法返回到游戏的(更大的)状态。
- MemoryCache是否在考虑缓存的贡献大小时同时考虑PlayerState和GameState?
- 也许更像是“直接存储在缓存中的对象及其成员所占用的托管堆上的总大小,以及通过这些对象的成员可达的所有内容”?
- 似乎将
GameState
的贡献限制乘以5只因为有5个玩家被缓存是很愚蠢的...但另一方面,可能的实现可能会这样做,并且难以计算PlayerState
而不计算GameState
。
- 如果一个对象在MemoryCache中存储多次,每个条目是否单独计入限制?
- 与前一个问题相关,如果一个对象直接存储在MemoryCache中,但也间接通过另一个对象的成员存储,则任何一个对内存限制的影响是什么?
- 如果一个对象存储在MemoryCache中,但也被某些与MemoryCache完全断开连接的其他活动对象引用,哪些对象会计入内存限制? 如果它是对象数组,其中一些(但不是全部)具有传入的外部引用,情况又如何?