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仅仅不足以处理他的数据库?
答案 0 :(得分:1)
Sax解析方法不会在内存中加载内容(而不是DOM)。只有处理SAX生成的事件的方式才会导致内存过载。
如果您允许用户自由选择XML源,则必须:
此OutOfMemoryError的另一个原因可能是应用程序中的内存泄漏与XML解析器无关。例如,如果不小心处理,方向更改很容易导致内存泄漏。如果您的应用程序内存已经饱和,则可以通过任何内存分配来触发OutOfMemoryError,但是这个单个内存分配可能不会对整个进程内存饱和负责。
答案 1 :(得分:0)
内存容易出现(我的意思是将XML文件放在RAM中)。 SAX Parser是一种基于流的解析方法(与DOM Parser相反)。所以SAX本身不能消耗大量内存。最好的方法是将XML保存到外部文件/存储,将流数据从文件直接保存到SAX Parser。这种方法与SAX解析器的使用方式完全相同。