3

我有一个 Mono for Android 应用程序,它使用 .NET XmlDocument类读取 XML 文件。每个文档大约 180K。

在解析每个文档并创建自己的内部数据结构后,我没有留下对XmlDocument实例的引用,因此它可以进行垃圾回收。

但是,问题是,在该集合发生之前需要 5-6 秒,如果我在 5-6 秒内加载多个文档,我的应用程序会崩溃到操作系统,没有打印错误消息,也没有抛出异常等。它只是说线程 12 已退出(我没有创建任何额外的线程,所以我也不明白为什么它是线程 12——XmlDocument 的线程?)。

如果我加载文档 1,然后等待 5 秒,然后加载文档 2,等待 5 秒然后加载文档 3,等等,那么一切正常。

在这种情况下,在 5 秒的等待期间,我可以看到 GC 启动了几次,并在 4-5 个周期内总共释放了大约 1MB 的内存(一些标记为 EXPLICIT,一些标记为 CONCURRENT)。

一旦按照我找到的一篇文章的建议完成后,我还尝试添加对 xmlDocument.RemoveAll() 的调用。之后我还添加了对 GC.Collect() 的调用。它略有帮助,但它仍然崩溃,只是不太频繁。

知道如何增加可用内存或让XmlDocument表现得更好吗?

4

1 回答 1

0

这与其说是一个答案,不如说是一个替代方案,但我使用 XmlTextReader 重写了我的 XML 解析代码,问题不再出现。

当然 XmlTextReader 不需要将整个 XML 文件加载到内存中,这对内存的使用有很大的帮助。

我可以一个接一个地快速加载多个文件,现在没有崩溃。

XmlTextReader API 需要做更多的工作才能做到正确,但现在看起来很可靠。

于 2012-08-15T20:38:59.457 回答