该应用程序是一个Windows服务,它正在检索我的实体的通用列表,然后根据返回的数据,我正在运行其他任务。该数据是只读的。不需要更新后端存储(Oracle 11g)中的数据。
为什么我相信我有内存泄漏? 尽管通过using语句处理上下文,但GC似乎并没有收获这些对象。在分析应用程序时,我注意到堆内存在应用程序的整个生命周期中逐渐增加。我还注意到不止一些GEN 2集合,这当然意味着对象在被收集之前已经存在了相当长的一段时间。 当我只返回手动生成的对象集合时,不会发生这种情况。在那种情况下,我看到很少有GEN 2集合(好),堆内存不会逐渐增加。
我正在运行Entity Framework 5.0 / C#4.5。我正在访问Oracle数据库。我正在使用数据库第一种方法。
除了立即处理上下文外,我还能做些什么来确保GC收集上下文?
public IEnumerable<EventServer> GetRegionalEventServers()
{
IEnumerable<EventServer> eventServers = null;
using (AssetEntities context = new AssetEntities())
{
context.Configuration.AutoDetectChangesEnabled = false;
context.Configuration.LazyLoadingEnabled = false;
context.Configuration.ProxyCreationEnabled = false;
try
{
eventServers = from p in context.EVENTSERVERS
select new EventServer
{
ServerName = p.SERVER_NAME,
Domain = p.DOMAIN,
ServerLocation = p.SERVER_LOCATION
};
return eventServers;
}
finally
{
eventServers = null;
}
}
}