使用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