我在一个循环中打开一系列大文件,而且我得到了一个我不明白的内存泄漏。 以下代码不会产生内存泄漏:
DataContractSerializer dataContractSerializer = new DataContractSerializer(typeof(List<GeographicalEntity>), GetKnownTypes());
List<GeographicalEntity> temporaryEntities;
using (FileStream fileStream = new FileStream(dataFilePath, FileMode.Open))
{
temporaryEntities = dataContractSerializer.ReadObject(fileStream) as List<GeographicalEntity>;
}
geographicalEntities.AddRange(temporaryEntities);
temporaryEntities.Clear();
temporaryEntities = null;
dataContractSerializer = null;
相反,以下代码的内存使用量继续增加:
DataContractSerializer dataContractSerializer = new DataContractSerializer(typeof(List<GeographicalEntity>), GetKnownTypes());
List<GeographicalEntity> temporaryEntities;
using (FileStream fileStream = new FileStream(dataFilePath, FileMode.Open))
{
temporaryEntities = dataContractSerializer.ReadObject(fileStream) as List<GeographicalEntity>;
}
geographicalEntities.AddRange(temporaryEntities);
//temporaryEntities.Clear();
//temporaryEntities = null;
dataContractSerializer = null;
我不明白为什么'temporaryEntities'需要被清除和取消。没有其他对此变量的引用。有人可以解释这种行为吗?
答案 0 :(得分:0)
geographicEntities.AddRange()似乎正在收集GeographicalEntity的列表。
为什么内存使用率不会上升?
第一个不是因为你要添加它们然后再次清除它们,所以geographicEntities有一个空列表的集合。
编辑:实际上只是意识到地理实体是一个列表&lt;&gt;所以我的最后一句话也不适用。
我猜猜引用的代码不代表真实的东西。整个文件读取在引用的代码中是荒谬的,所以我猜想在简化中丢失了一些东西。
答案 1 :(得分:0)
你确定差异不是在使用temporaryEntities.Clear()吗?因为它也被注释掉了。
当一个集合包含一个对象时,该对象不会被标记为垃圾收集(它也是一个引用)。