C# XmlDocument()内存泄漏

C# XmlDocument()内存泄漏,c#,memory-leaks,windows-mobile,xmldocument,windows-mobile-6.1,C#,Memory Leaks,Windows Mobile,Xmldocument,Windows Mobile 6.1,我相信我的一些使用XmlDocument类的代码存在内存泄漏 我的程序在Windows 6.1.4设备(C#)上运行,从另一台服务器上的数据库读取数据,查看是否需要卸载设备上安装的任何程序,然后从XML文档读取可卸载程序的名称。然后,程序将匹配列表,并在必要时相应地卸载。这个过程是无限循环的,在后台运行,但我注意到的是,随着时间的推移,内存缓慢上升,程序最终捕获到OutOfMemoryException 如果我在循环中注释掉所有内容而不做任何操作,内存将始终保持在2MB左右。如果我把下面的代码都

我相信我的一些使用XmlDocument类的代码存在内存泄漏

我的程序在Windows 6.1.4设备(C#)上运行,从另一台服务器上的数据库读取数据,查看是否需要卸载设备上安装的任何程序,然后从XML文档读取可卸载程序的名称。然后,程序将匹配列表,并在必要时相应地卸载。这个过程是无限循环的,在后台运行,但我注意到的是,随着时间的推移,内存缓慢上升,程序最终捕获到
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;
foreach(卸载程序中的字符串programName)
{
XmlDocument xmlDoc1=新的XmlDocument();
xmlDoc1.LoadXml(“”)+
"  " +
"    " +
"     " +
"    " +
"  " +
"");
xmlDoc1=ConfigurationManager.ProcessConfiguration(xmlDoc1,true);
cmdStr+=“从设备应用程序中删除,其中ID=“+deviceAppIDList[count++]+”;
xmlDoc1=null;
}
//检查要卸载的预装应用程序
计数=0;
XmlDocument xmlDoc2=新的XmlDocument();
xmlDoc2.LoadXml(“”)+
"");
/****下面的行似乎是内存泄漏的原因****/
//xmlDoc2=ConfigurationManager.ProcessConfiguration(xmlDoc2,true);
XmlNodeList XmlNodeList=xmlDoc2。选择节点(“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中。

在您显示的代码中,cmdStr变得越来越大,但我看不到任何情况发生。。。因此,这将导致内存消耗无限增长,并导致OutOfMemory异常…

您可以将cmdStr的类型更改为StringBuilder。
因为字符串是不可变的,所以每当您向字符串添加内容时,它都会被复制。

看来解决这个问题的方法是使用
DMProcessConfigXML()
以本机方式执行。使用此方法不会导致内存泄漏。因此,包装器中一定有某种东西没有正确释放其资源

在迭代许多~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);
    }
}
所有的工作都是C函数完成的。现在,垃圾收集理解了何时可以从内存中删除xml的重复问题 寻找格尔基·克塞格的答案

using语句将调用Dispose来清理资源。
XmlDocument不可识别,但FileStream可识别。

顺便说一句,当有人添加一个非平凡的程序名时,您的代码就完蛋了;将字符串连接到xml而不对其进行编码是危险的-损坏的xml是肯定的。仅供参考。请注意我是如何编辑问题的代码部分的。您只需要在代码行前面加四个空格。不需要pre和code HTML标记。这是真的,但是填充programName的数据是从数据库检索的,数据库是从掌上电脑本身填充的。所以,是的,如果数据库被破坏,肯定会有一个问题,但更大的问题。感谢犬夜叉的修复!抱歉,我应该提到该变量稍后会被使用,并在循环结束时用cmdStr=string.Empty;重置;。我没有把所有的代码都放在我的循环中,只是因为里面有很多代码。不过我已经把它缩小到了这个区块。
Global.WriteToFile
做什么?您可以对这些调用进行注释并再次检查,或者显示此方法的源代码吗?我删除了这些行,它们只是写入我保留的日志文件。是的,但是有什么变化吗?内存增长仍然相同还是较慢?内存增长仍然相同。