0

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

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

这里的概念...

  • 类别:服务 操作:开始

  • :Cacheloader 操作:LoadCache

  • :DataAccessLayer 操作:Store_Cache_in_DB

……别问我为什么,但是……

  • A) Cacheloader 在服务“启动”方法中作为局部变量“新增”。
  • B)DataAccessLayer 对服务是静态的(通过 IOC 的单例)

所以代码有点像这样

服务

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

缓存加载器

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

数据访问层

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 对象的“实体”。我想知道垃圾收集器是否不会以某种方式清理这些,因为它们以某种方式被静态类引用?如果是这种情况,首先将实体分配给局部变量是否会有所帮助...

数据访问层:

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

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

...希望这能解决我的问题。如果这不是我的内存消耗如此之高的原因,还有其他想法吗?同样,我确信这种缓存技术是肇事者。

提前致谢!

4

1 回答 1

1

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

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

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

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

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

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

我建议在内存分析器下运行它,因为它会告诉你究竟是什么保留在你的内存中。

于 2012-06-22T21:57:03.760 回答