使用StreamReader和XmlSerializer的内存泄漏

在过去的几个小时里,我一直在谷歌上搜索,尝试了不同的事情,但似乎无法深入了解……。

当我运行此代码时,内存使用量持续增长。

while (true)

{

try

{

foreach (string sym in stringlist)

{

StreamReader r = new StreamReader(@"C:\Program Files\" + sym + ".xml");

XmlSerializer xml = new XmlSerializer(typeof(XMLObj), new XmlRootAttribute("rootNode"));

XMLObj obj = (XMLObj)xml.Deserialize(r);

obj.Dispose();

r.Dispose();

r.Close();

}

}

catch(Exception ex)

{

Console.WriteLine(ex.ToString());

}

Thread.Sleep(1000);

Console.Clear();

}

XMLObj是一个自定义对象

[Serializable()]

public class XMLObj: IDisposable

{

[XmlElement("block")]

public List<XMLnode> nodes{ get; set; }

public XMLObj() { }

public void Dispose()

{

nodes.ForEach(n => n.Dispose());

nodes= null;

GC.SuppressFinalize(this);

}

}

我试过添加GC.Collect(); 但这似乎无济于事。

回答:

泄漏在这里:

new XmlSerializer(typeof(XMLObj), new XmlRootAttribute("rootNode"))

XmlSerializer使用程序集生成,并且无法收集程序集。对于 最简单的 构造方法(new

XmlSerializer(Type),等),它会执行一些自动缓存/重用操作,但对于这种情况则 。因此,您应该手动缓存它:

static readonly XmlSerializer mySerializer =

new XmlSerializer(typeof(XMLObj), new XmlRootAttribute("rootNode"))

并使用缓存的序列化程序实例。

以上是 使用StreamReader和XmlSerializer的内存泄漏 的全部内容, 来源链接: utcz.com/qa/397693.html

回到顶部