首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OutOfMemoryError

OutOfMemoryError
EN

Stack Overflow用户
提问于 2010-12-29 22:00:19
回答 2查看 887关注 0票数 3
代码语言:javascript
复制
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解析到内存(RAM)的功能,我不知道所有的细节,因为这个信息是由市场上的匿名用户提供的。

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-29 22:19:27

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

如果您允许用户自由选择XML源,则必须执行以下任一操作:

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

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

票数 1
EN

Stack Overflow用户

发布于 2010-12-29 22:22:50

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4554735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档