一尘不染

使用StreamReader和XmlSerializer的内存泄漏

c#

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

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

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(); 但这似乎无济于事。


阅读 357

收藏
2020-05-19

共1个答案

一尘不染

泄漏在这里:

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

XmlSerializer使用程序集生成,并且无法收集程序集。对于 最简单的 构造方法(new XmlSerializer(Type),等),它会执行一些自动缓存/重用操作,但对于这种情况则 不会 。因此,您应该手动缓存它:

static readonly XmlSerializer mySerializer =
    new XmlSerializer(typeof(XMLObj), new XmlRootAttribute("rootNode"))

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

2020-05-19