我最近在我为工作而维护的应用程序中发现了内存泄漏,我对为什么代码会产生泄漏感到困惑。我已经提取了相关代码(稍作修改)并在下面提供。
在我们的应用程序中,给定的 XML 文档可以针对一个或多个可用的模式文件进行验证。随着时间的推移,每个模式文件都对应于 XML 文档的不同版本。我们只关心 XML 文档是否针对至少一种模式进行验证。每个模式都完整地描述了 XML 文档的内容(它们不是嵌套的模式文件)。
根据 ANTS 内存分析器,看起来 XmlDocument 对象正在隐藏对先前模式的引用,即使在模式集已被清除之后也是如此。注释掉对 Validate() 的调用,让其他所有内容保持不变,将阻止泄漏。
我通过在应用程序初始化时加载模式一次并换出与 XML 文档相关联的模式文件,直到我们找到一个可以验证的模式来修复我们的应用程序中的泄漏。
下面的代码会产生内存泄漏,我不知道为什么。
class Program
{
private static XmlDocument xmlDocument_ = new XmlDocument();
static void Main(string[] args)
{
using (StreamReader reader = new StreamReader("contents.xml"))
{
xmlDocument_.LoadXml(reader.ReadToEnd());
}
XmlReaderSettings xmlReaderSettings = new XmlReaderSettings();
xmlReaderSettings.CloseInput = true;
while (true)
{
xmlDocument_.Schemas = new XmlSchemaSet();
XmlReader xmlReader = XmlReader.Create("schema.xsd", xmlReaderSettings);
xmlDocument_.Schemas.Add(XmlSchema.Read(xmlReader, null));
xmlReader.Close();
xmlDocument_.Validate(null);
}
}
}