缓存技术不会触发.Net Windows服务中的垃圾收集器

时间:2012-06-22 21:52:39

标签: c# caching windows-services garbage-collection pass-by-reference

我目前遇到的问题是我的一个基于.Net的Windows服务占用了太多内存。

我几乎肯定它与缓存实现有关,我已经决定使用“数据库”缓存技术,并且问题出现在我最初在服务启动时加载缓存值的方式。 / p>

这是概念......

  • 班级:服务 操作:开始

  • :Cacheloader 操作:LoadCache

  • :DataAccessLayer 操作:Store_Cache_in_DB

......不要问我为什么,但......

  • A)Cacheloader在服务“启动”方法中作为本地变量“新建”。
  • B)DataAccessLayer对服务是静态的(通过IOC的Singleton)

所以代码有点像这样

服务

start()
{
    _cacheLoader = new Cacheloader(_dataAccessLayer); 
    _cacheLoader.LoadCache();
}

的CacheLoader

LoadCache()
{
    var entities = _dataAccessLayer.FindEntitiesForCache(); 
    _dataAccessLayer.Store_Cache_in_DB(entities); 
}

DataAccessLayer

Store_Cache_in_DB(List<Entity> entities)
{
    using(someConnection)
    {
        stored entities in datatable
        pass database to sproc that stores each entity
    }       
}   

因此,我关注的是通过Store_Cache_in_DB方法传递给静态DataAccessLayer对象的“实体”。我想知道垃圾收集器是否会以某种方式清除它们,因为它们已被静态类引用?如果是这种情况,那么首先将实体分配给局部变量是否有帮助......

DataAccessLayer:

Store_Cache_in_DB(List<Entity> entities)
{
    var cachedEntities = entities;

    using(someConnection)
    {
        stored cachedEntities in datatable
        pass database to sproc that stores each entity
    }       
} 

...希望这可以解决我的问题。如果这不是我的记忆消耗如此之高的原因,还有其他想法吗?我再次确信这种缓存技术是犯罪者。

提前致谢!

1 个答案:

答案 0 :(得分:1)

  

如果是这种情况,首先将实体分配给局部变量是否有帮助......

拥有本地不会改变任何东西 - 用户代码可以访问相同的对象实例。

可能阻止垃圾收集的唯一部分是这里发生的事情:

using(someConnection)
{
    stored cachedEntities in datatable
    pass database to sproc that stores each entity
}       

如果entities保留在一个持续存在的变量中,它将阻止以后收集它们。

  

如果这不是我的记忆消耗如此之高的原因,还有其他想法吗?

我建议在内存分析器下运行它,因为它会准确地告诉你内存是什么。