Android OutOfMemoryError java.lang.OutOfMemoryError 位于com.solvoterra.xmlnengine.Element.(Element.java:9) 在com.solvoterra.xmlnengine.XML\u Handler\u Main.startElement(XML\u Handler\u Main.java:71) 位于org.apache.harmony.xml.ExpatParser.startElement(ExpatParser.java:146) 位于org.apache.harmony.xml.ExpatParser.append(本机方法) 位于org.apache.harmony.xml.ExpatParser.parseFragment(ExpatParser.java:505) 位于org.apache.harmony.xml.ExpatParser.parseDocument(ExpatParser.java:492) 位于org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:308) 位于org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:264) 在com.solvoterra.xmlnengine.Project_Man.readXML_文件(Project_Man.java:148)上 在com.solvoterra.xmlnengine.Project_-Man.run(Project_-Man.java:83) 运行(Thread.java:1102)

Android OutOfMemoryError java.lang.OutOfMemoryError 位于com.solvoterra.xmlnengine.Element.(Element.java:9) 在com.solvoterra.xmlnengine.XML\u Handler\u Main.startElement(XML\u Handler\u Main.java:71) 位于org.apache.harmony.xml.ExpatParser.startElement(ExpatParser.java:146) 位于org.apache.harmony.xml.ExpatParser.append(本机方法) 位于org.apache.harmony.xml.ExpatParser.parseFragment(ExpatParser.java:505) 位于org.apache.harmony.xml.ExpatParser.parseDocument(ExpatParser.java:492) 位于org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:308) 位于org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:264) 在com.solvoterra.xmlnengine.Project_Man.readXML_文件(Project_Man.java:148)上 在com.solvoterra.xmlnengine.Project_-Man.run(Project_-Man.java:83) 运行(Thread.java:1102),android,out-of-memory,Android,Out Of Memory,我可以从中看出,在运行一个只包含SAX将XML文件解析到内存(RAM)的函数的新进程时发生了错误。我不知道所有细节,因为这些信息是由市场上的匿名用户提供的 在调用解析函数之前,清除所有缓冲区和内存中的现有数据 问:有没有可能用户正试图将一个巨大的XML数据库解析到内存中,而他的手机分配的RAM根本不足以处理他的数据库?Sax解析方法本身不会在内存中加载内容(与DOM相反)。只有处理SAX生成的事件的方法才能导致内存过载 如果允许用户自由选择XML源,则必须: 构建一个解析算法,将每次解析一个元

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

在调用解析函数之前,清除所有缓冲区和内存中的现有数据


问:有没有可能用户正试图将一个巨大的XML数据库解析到内存中,而他的手机分配的RAM根本不足以处理他的数据库?

Sax解析方法本身不会在内存中加载内容(与DOM相反)。只有处理SAX生成的事件的方法才能导致内存过载

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

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

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

内存不足是很容易发生的(我的意思是,如果XML文件放在RAM中)。SAX解析器是一种基于流的解析方法(与DOM解析器相反)。因此SAX本身不能消耗大量内存。最好的方法是将XML保存到外部文件/存储器,并将文件中的流数据直接保存到SAX解析器。这种方法正是使用SAX解析器的方式。

也许你应该考虑使用SQLite数据库,只是浏览里面的查询而不是解析XML。我正在编写一个XML编辑器。如果是这样的话,我确实想到了你的第二个选择,但是如果用户正在使用4mib XML文件,那么每次用户想要导航到一个新节点时,都必须读取整个文件,这将导致相当缓慢的浏览。最简单的选择当然是您的第三个选项,我想我需要使用不同的文件大小运行一些测试。有一种方法可以请求为应用程序分配更多的内存??没有,并且限制在不同的设备上可能不同。XML文件确实正在传递到数组中,因此基本上与DOM解析器一样需要。我想我要运行文件大小测试来确定到底有多少字节导致了OoME。
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)