背景: 我有一个服务,其目的是为请求者提供对象 - 它基本上从数据库中获取复杂数据并将其转换一次(有点像数据视图)以生成一个简单的记录。然后通过按需提供最多10万条记录(取决于请求的性质)来处理来自其他服务的请求。优化长寿命对象的收集
这个想法是,复杂的转换只需完成一次,然后通过服务进行缓存 - 比每次访问视图时都要让数据库解决问题的速度更快,而且对于我的目的而言工作得很好。 (我相信这是由一些所谓的SSOS)
数据被缓存的方式是在为物业袋标准.NET类型对象的列表。这些对象没有任何其他引用。 定期记录将会改变,并且必须更新缓存,这意味着原始记录必须被定位,丢弃并被替换。
现在在高速缓存中的记录会一直在那里很长一段时间,并会被标记为第2代集合;几乎所有的收藏品都会在Gen2阶段发生,因为这些物品已经存在了很长时间(有意)。
所以我的第二代收藏的理解是,他们是缓慢的,如果集合工作主要是在第二代则优化会更经常地做到这一点。
我希望能够以引用完整Gen2集合的方式去除列表中的某个对象......我想也许有一种将它标记为Gen0的方法然后在更换之前取消参考 - 但我认为这是不可能的。
我不得不使用.NET 4中,这和应用是用作数据多达100个客户端请求谁完整列表,或更改列表一段时间的服务。
问题:任何人都可以提出一个方式去参考长期生活的对象在GC友好的方式或者是另一种方式来解决这个问题?
您目前是否有任何内存/性能问题? – ken2k 2013-03-08 12:50:33
是的,它在内存使用上运行很热。我把它降到了1GB(峰值) - 但它正在做很多处理 - 在同时查询/序列化/向大量客户端提供大量数据时,最高可以使用高达70%的cpu。这就是为什么我已经开始关注GC性能,看看我能做些什么来获得大量的处理能力。我知道我也有一个线程问题 - 但不认为我可以(或者想 - 我需要让管理层有理由移到4.5!)修复,直到我能够移动到.net 4.5并使用异步/等待模型释放线程。 – Jay 2013-03-08 12:54:22
@Jay注意到由此引起的GC perf将限于周期性尖峰(通常相当可预测/均匀间隔)。它不会改变*集合之间的性能*。所以,如果你的应用程序已经很热,你可能会看错了。 – 2013-03-08 12:56:10