在过去的几个小时里,我一直在谷歌上搜索,尝试了不同的事情,但似乎无法深入了解……。
当我运行此代码时,内存使用量持续增长。
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),等),它会执行一些自动缓存/重用操作,但对于这种情况则 不会 。因此,您应该手动缓存它:
XmlSerializer
new XmlSerializer(Type)
static readonly XmlSerializer mySerializer = new XmlSerializer(typeof(XMLObj), new XmlRootAttribute("rootNode"))
并使用缓存的序列化程序实例。