XmlDocument()的内存泄漏。

问题描述 投票:3回答:5

我相信我的一些使用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(); 在我的循环末端,这似乎有助于减缓泄漏,但它不能完全解决它。此外,我读到它不是一个好的做法,反正使用它。

编辑。 So it seems to be the ConfigurationManager line that I commented out in my code above that has the memory leak. 所以似乎是我在上面的代码中注释出来的ConfigurationManager行出现了内存泄漏。 只要我注释出那行代码,内存泄漏就停止了。 当我取消注释这一行时,它又开始了。 我是否需要在调用ProcessConfiguration后做一些事情来释放内存?

另外,我使用的是Microsoft.WindowsMobile.Configuration命名空间的ConfigurationManager运行时版本1.1.4322,因为CF中不存在System.Configuration。

c# memory-leaks windows-mobile xmldocument windows-mobile-6.1
5个回答
2
投票

我在迭代许多约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);
    }
}

函数forGC完成了所有的工作 现在,垃圾回收明白了什么时候可以从内存中删除一个xml。


0
投票

在你的代码中,cmdStr会变得越来越大,但我没有看到任何事情发生......所以这将导致你的内存消耗无限增长,并导致OutOfMemory-Exception......


0
投票

你可以将cmdStr的类型改为StringBuilder。因为字符串是不可改变的,每次你在字符串中添加一些东西时,它都会被复制过来。


0
投票

看起来这个问题的答案是使用本机的 DMProcessConfigXML(). 使用这个方法不会造成内存泄漏。 所以一定是包装器内部有什么东西没有正确释放资源。


0
投票

重复的问题https:/stackoverflow.comquestions42226993如何处置xmld文档。找György Kőszeg回答。

using语句将调用Dispose来清理资源.XmlDocument不是IDisposable,但FileStream是。

© www.soinside.com 2019 - 2024. All rights reserved.