我有一个Mono应用程序,它使用.NET XmlDocument类读取XML文件。每一份文件大约180 K。
在解析每个文档并创建自己的内部数据结构之后,我不保留对XmlDocument实例的引用,因此它就有资格进行垃圾收集。
但问题是,在收集之前需要5-6秒,如果我在5-6秒内加载多个文档,我的应用程序就会崩溃到操作系统,没有打印错误消息,也没有抛出异常等等。它只是说线程12已经退出(我没有创建任何额外的线程,所以我不明白为什么它也是12线程-- XmlDocument的线程?)
如果我加载文档1,然后等待5秒,然后加载文档2,等待5秒,然后加载文档3,等等,那么一切都没问题。
在这种情况下,在5秒的等待过程中,我可以看到GC在4-5个周期内多次启动并释放大约1MB的内存(一些标记为显式,有些被标记为并发)。
我还尝试按照我发现的一篇文章的建议,在完成xmlDocument.RemoveAll()之后添加一个调用。在此之后,我还添加了对GC.Collect()的调用。它稍微有所帮助,但它仍然崩溃,只是稍微少了一些。
您知道如何增加可用内存或使XmlDocument运行得更好吗?
发布于 2012-08-15 20:38:59
与其说这是一个答案,不如说它是一个替代方案,但我使用XmlTextReader重写了我的XML解析代码,这个问题不再发生。
当然,XmlTextReader不需要将整个XML文件加载到内存中,这对内存的使用有很大的帮助。
我可以非常快地加载多个文件,一个接一个,现在没有崩溃。
XmlTextReader API还需要做更多的工作,但现在情况似乎相当稳定。
https://stackoverflow.com/questions/11961020
复制相似问题