的OutOfMemoryError

时间:2010-12-29 14:00:19

标签: android out-of-memory

java.lang.OutOfMemoryError
at com.solvoterra.xmlengine.Element.<init>(Element.java:9)
at com.solvoterra.xmlengine.XML_Handler_Main.startElement(XML_Handler_Main.java:71)
at org.apache.harmony.xml.ExpatParser.startElement(ExpatParser.java:146)
at org.apache.harmony.xml.ExpatParser.append(Native Method)
at org.apache.harmony.xml.ExpatParser.parseFragment(ExpatParser.java:505)
at org.apache.harmony.xml.ExpatParser.parseDocument(ExpatParser.java:492)
at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:308)
at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:264)
at com.solvoterra.xmlengine.Project_Man.readXML_File(Project_Man.java:148)
at com.solvoterra.xmlengine.Project_Man.run(Project_Man.java:83)
at java.lang.Thread.run(Thread.java:1102)

我可以看到在运行新进程时发生错误,该进程只包含SAX函数将XML文件解析到内存(RAM)我不知道所有细节,因为此信息是由匿名提供的用户在市场上。

在调用Parse函数之前,所有缓冲区和内存都清除了现有数据。

问:用户是否可能尝试将巨大的XML数据库解析到内存中,而手机分配的RAM仅仅不足以处理他的数据库?

2 个答案:

答案 0 :(得分:1)

Sax解析方法不会在内存中加载内容(而不是DOM)。只有处理SAX生成的事件的方式才会导致内存过载。

如果您允许用户自由选择XML源,则必须:

  • 构建一个解析算法,该算法存储在BD或文件中,一次解析一个元素的结果
  • 构建一个解析算法,该算法加载XML源的前X个元素,如果可能,允许在请求时获取以下元素(paginate)
  • 在解析之前检查XML源的长度,以便向用户显示一条错误消息,要求他加载较小的源

此OutOfMemoryError的另一个原因可能是应用程序中的内存泄漏与XML解析器无关。例如,如果不小心处理,方向更改很容易导致内存泄漏。如果您的应用程序内存已经饱和,则可以通过任何内存分配来触发OutOfMemoryError,但是这个单个内存分配可能不会对整个进程内存饱和负责。

答案 1 :(得分:0)

内存容易出现(我的意思是将XML文件放在RAM中)。 SAX Parser是一种基于流的解析方法(与DOM Parser相反)。所以SAX本身不能消耗大量内存。最好的方法是将XML保存到外部文件/存储,将流数据从文件直接保存到SAX Parser。这种方法与SAX解析器的使用方式完全相同。