我目前遇到的问题是我的一个基于.Net的Windows服务占用了太多内存。
我几乎肯定它与缓存实现有关,我已经决定使用“数据库”缓存技术,并且问题出现在我最初在服务启动时加载缓存值的方式。 / p>
这是概念......
班级:服务 操作:开始
类:Cacheloader 操作:LoadCache
类:DataAccessLayer 操作:Store_Cache_in_DB
......不要问我为什么,但......
所以代码有点像这样
服务:
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
}
}
...希望这可以解决我的问题。如果这不是我的记忆消耗如此之高的原因,还有其他想法吗?我再次确信这种缓存技术是犯罪者。
提前致谢!
答案 0 :(得分:1)
如果是这种情况,首先将实体分配给局部变量是否有帮助......
拥有本地不会改变任何东西 - 用户代码可以访问相同的对象实例。
可能阻止垃圾收集的唯一部分是这里发生的事情:
using(someConnection)
{
stored cachedEntities in datatable
pass database to sproc that stores each entity
}
如果entities
保留在一个持续存在的变量中,它将阻止以后收集它们。
如果这不是我的记忆消耗如此之高的原因,还有其他想法吗?
我建议在内存分析器下运行它,因为它会准确地告诉你内存是什么。