我正在.NET应用程序中工作,我们使用Dictionary实现了非常大的缓存。我通过TTL和收割机从缓存中删除东西,定期检查过期的物品。给定的常见TTL值将是小时数。考虑到这一点,当我将每个对象放入缓存时,我可以做任何事情,这样每次我想要缓存几个小时的东西时我都不需要通过Gen0和Gen1吗?
编辑:我应该更好地指出我的问题。我理解.NET垃圾收集是如何工作的,我知道它很擅长它的工作。我同意在理想的情况下,你会希望它的工作与设计完全一致。但具体来说,我想知道是否有任何方法可以控制它在这种情况下的工作方式。
答案 0 :(得分:3)
你的对象将相对较快地提升到Gen2,因为你的词典总是会让它生根。
没有一个API允许您直接分配到不同的代,但我怀疑这会对性能产生真实的影响,因为如果它们真的不需要很长时间才能获得提升。重新保持根深蒂固。具有多小时生命周期的对象的任何缓存都不应该是经常分配的缓存,因此即使可能的话,您所获得的节省也是微不足道的。
答案 1 :(得分:0)
如果缓存很大,你可能想看看在缓存中汇集对象,而不是在一段时间之后删除它们并放入新的。否则你正在做的是从对象中制造垃圾已被塞进Gen 2的一角,GC可能无法收集很长时间。这可能导致应用程序的内存占用增加,这是由于未使用的对象造成的,但是在GC处于足够的压力下以便将其挖出之前也不会被收集。
显然这与长时间运行此实例的情况更相关,但是如果你在几个小时之后扔掉东西,听起来就像你正在做的那样。