有人可以用FileStream解释WPF内存泄漏吗?

时间:2011-11-14 17:05:11

标签: wpf memory-leaks

我在一个循环中打开一系列大文件,而且我得到了一个我不明白的内存泄漏。 以下代码不会产生内存泄漏:

 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'需要被清除和取消。没有其他对此变量的引用。有人可以解释这种行为吗?

2 个答案:

答案 0 :(得分:0)

geographicEntities.AddRange()似乎正在收集GeographicalEntity的列表。

为什么内存使用率不会上升?

第一个不是因为你要添加它们然后再次清除它们,所以geographicEntities有一个空列表的集合。

编辑:实际上只是意识到地理实体是一个列表&lt;&gt;所以我的最后一句话也不适用。

我猜猜引用的代码不代表真实的东西。整个文件读取在引用的代码中是荒谬的,所以我猜想在简化中丢失了一些东西。

答案 1 :(得分:0)

你确定差异不是在使用temporaryEntities.Clear()吗?因为它也被注释掉了。

当一个集合包含一个对象时,该对象不会被标记为垃圾收集(它也是一个引用)。