我相信我的一些使用 XmlDocument 类的代码存在内存泄漏。
我的程序在 Windows 6.1.4 设备 (C#) 上运行,并从另一台服务器上的数据库中读取,以查看是否需要卸载设备上安装的任何程序,然后从 XmlDocument 中读取以获取可卸载程序的名称. 然后程序匹配列表并在必要时进行相应的卸载。这个过程无限循环并在后台运行,但我注意到内存随着时间的推移缓慢上升,程序最终捕获一个OutOfMemoryException
.
如果我注释掉所有内容并且在循环中什么都不做,内存始终保持在 2MB 左右。如果我留下所有内容,但将以下代码注释掉,那么内存使用量每分钟连续增加 0.05 兆字节左右。这些结果是让循环睡眠 1 秒。正常的睡眠速度约为 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 以释放内存后,我需要做些什么吗?
此外,我使用 Microsoft.WindowsMobile.Configuration 命名空间作为 ConfigurationManager 运行时版本 1.1.4322,因为 CF 中不存在 System.Configuration。