我相信我的一些使用 XmlDocument 类的代码存在内存泄漏。
我的程序在 Windows 6.1.4 设备 (C#) 上运行并从另一台服务器上的数据库中读取以查看是否需要卸载设备上安装的任何程序,然后从 XmlDocument 中读取以获取程序的名称是可卸载的。然后程序会匹配列表并在必要时相应地卸载。此过程无限循环并在后台运行,但我注意到内存会随着时间缓慢增加,程序最终会捕获到 OutOfMemoryException
。
如果我注释掉所有内容并且在循环中什么都不做,内存将始终保持在 2MB 左右。如果除了注释掉以下代码之外的所有内容,那么内存使用量每分钟左右连续增加 0.05 兆字节。这些结果是让循环休眠 1 秒。正常的 sleep 速度是10分钟左右。关于可能导致泄漏的原因以及它是否与 XmlDocument 类有关的任何想法?
foreach (string programName in uninstallPrograms)
{
XmlDocument xmlDoc1 = new XmlDocument();
xmlDoc1.LoadXml("<wap-provisioningdoc>" +
" <characteristic type=\"UnInstall\">" +
" <characteristic type=\"" + programName + "\">" +
" <parm name=\"uninstall\" value=\"1\"/>" +
" </characteristic>" +
" </characteristic>" +
"</wap-provisioningdoc>");
xmlDoc1 = ConfigurationManager.ProcessConfiguration(xmlDoc1, true);
cmdStr += "DELETE FROM DEVICE_APPS WHERE ID = " + deviceAppIDList[count++] + "; ";
xmlDoc1 = null;
}
// Check for pre-installed apps to uninstall
count = 0;
XmlDocument xmlDoc2 = new XmlDocument();
xmlDoc2.LoadXml("<wap-provisioningdoc><characteristic-query type=\"UnInstall\"/>" +
"</wap-provisioningdoc>");
/**** The line below seems to be the cause of the memory leak ****/
//xmlDoc2 = ConfigurationManager.ProcessConfiguration(xmlDoc2, true);
XmlNodeList xmlNodeList = xmlDoc2.SelectNodes("wap-provisioningdoc/" +
"characteristic[@type='UnInstall']/characteristic/@type");
xmlDoc2 = null;
cmdStr
最终会被使用,并在循环结束时设置为 string.Empty
。起初,我的代码中没有 xmlDoc = null;
,但这两种方式都没有帮助。我尝试在循环末尾添加 GC.Collect();
,这似乎有助于减缓泄漏,但并不能完全解决问题。另外,我读过无论如何使用它都不是好的做法。
编辑: 所以似乎是我在上面的代码中注释掉的 ConfigurationManager 行有内存泄漏。一旦我注释掉那行代码,内存泄漏就会停止。当我取消注释此行时它开始备份。调用 ProcessConfiguration 释放内存后,我需要做些什么吗?
此外,我正在为 ConfigurationManager 运行时版本 1.1.4322 使用 Microsoft.WindowsMobile.Configuration 命名空间,因为 System.Configuration 在 CF 中不存在。
最佳答案
我在遍历许多约 100 MB 的 xml 文件时遇到了类似的问题。我尝试了上面写的所有东西,但没有一个有帮助。最后我将 xml 处理分离到一个单独的虚拟函数中,然后垃圾收集正常工作。我做了这样的事情:
function f()
{
FileInfo[] rgFiles = di.GetFiles("*.xml.gz", SearchOption.TopDirectoryOnly);
//process all *.xml.gz files in folder
foreach (FileInfo fi in rgFiles)
{
forGC(fi);
}
}
GC 函数完成了所有工作。现在垃圾收集理解何时可以从内存中删除 xml
关于c# - XmlDocument() 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6878974/