我的程序在运行于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。