2011-05-23 48 views
1

我正在.NET应用程序中使用字典实现非常大的缓存。我通过TTL和收割者从缓存中删除东西,定期检查过期的项目。一个给定的常见TTL值将在小时左右。考虑到这一点,当我将每个对象放入缓存中时,是否有任何事情可以处理,以便每次我想要缓存几小时时都不需要通过Gen0和Gen1?.NET垃圾收集调优已知有很长的使用寿命

编辑:我应该更好地指定我的问题。我了解.NET垃圾收集是如何工作的,我知道它很好。我同意在理想的情况下,你会希望它的工作完全按照它的设计工作。具体而言,我想知道是否有任何方法可以控制这种确切场景的工作方式。

+1

为什么你需要调整它?你能描述一下垃圾收集的确切问题吗? – 2011-05-23 18:09:29

+0

+1同意。由于物体是长期的,它们会得到提升,这就是GC设计的方式。 – 2011-05-23 18:13:11

+1

同意。我自己并不十分关注垃圾收集,但这是对我的尖叫“过早优化”。 – 2011-05-23 18:13:18

回答

3

由于您的字典将永远留下根源,因此您的对象将相对快速地升级到Gen2。

没有一个API可以让你直接分配到不同的一代,但我怀疑这会对性能产生真实世界的影响,因为如果对象真的不需要很长时间就可以升级对象'重新扎根。任何具有多小时生命周期对象的缓存都不应该是频繁分配的缓存,所以即使这可能会节省您的成本也是微不足道的。

0

如果缓存很大,您可能希望查看将缓存中的对象集中在一起,而不是在一段时间后删除它们并放入新的对象。否则,您正在做的是将垃圾从对象中删除已经卷入第二代的一个角落,并且GC可能不会长时间收集。这可能会导致应用程序的内存占用量增加,这是由于没有使用的对象造成的,而且在GC处于足够的压力下才能收集,因此也不会被收集。

很显然,这与长时间运行此实例的场景更相关,但如果您在几个小时后丢掉东西,那听起来就是您正在做的事情。

+0

您能详细说明通过汇集对象的含义吗? – LJM 2011-05-27 14:52:20

+0

不是分配新对象并将它们放入缓存中,而是在流程启动时向前分配适当数量的缓存对象,并更改这些对象的值,因为您希望它们随时间缓存不同的内容。所以你不会抛出这些对象,只需要在需要缓存新内容时改变它们的值。这是一般概述,但您可以在http://en.wikipedia.org/wiki/Object_pool_pattern找到更长的描述。这个想法是你停止allocate/garbage collect churn--池中的对象永远不会死掉,所以GC不会受到池的影响。 – 2011-05-31 21:47:12