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

java OutOfMemoryError
EN

Stack Overflow用户
提问于 2010-03-15 13:27:19
回答 3查看 3.2K关注 0票数 1

我在unix机器上运行以下命令。

java -Xms3800m -Xmx3800m org.apache.xalan.xslt.Process -out Cust.txt -in test13l.xml -xsl CustDetails.xsl

这是一个java命令,调用Xalan处理器使用xsl样式表(CustDetails.xsl)解析xml文件(test131.xml)并返回Cust.txt。

该命令运行良好,并生成输出。处理1.1 GB的xml文件需要12分钟。处理1.44 GB的文件需要22分钟。但是,当我尝试处理1.66 GB的文件大小时,它会出错,并显示以下消息:

(错误位置未知)XSLT错误(java.lang.OutOfMemoryError):空

我已经将java堆大小增加到3800,不知道还能做什么。

非常感谢你的帮助。

EN

回答 3

Stack Overflow用户

发布于 2010-03-15 20:21:28

Xalan可以在底层使用DOM或SAX解析器。

DOM解析器通常尝试一次读取整个文件,并在其中构建一个树,这会消耗大量内存来处理大文件。

另一方面,SAX解析器在解析时触发事件,因此不需要将整个文件保存在内存中(但您不能像访问树那样容易)。

确保您的Xalan在底层使用SAX解析器。您可以在此处找到有关如何执行此操作的说明:http://xml.apache.org/xalan-j/usagepatterns.html#sax

票数 2
EN

Stack Overflow用户

发布于 2010-03-15 13:30:16

您运行的是64位Java进程还是32位Java进程?你的系统实际有多少内存?你的OOM的全栈跟踪是什么?您运行的是哪个JVM版本?您始终可以运行JConsole并转储堆,然后在Eclipse MAT之类的工具中打开它,以查看哪些对象正在占用堆。根据您的JVM版本,您可以使用-XX:+HeapDumpOnOutOfMemory运行您的进程,并在Java进程耗尽内存后打开转储。

票数 1
EN

Stack Overflow用户

发布于 2010-03-15 15:55:16

在内存中生成一个巨大的DOM树不是一种可行的方法;要找到一种方法为您的XSL Transformer提供StAX事件,比如SAX或XML。永远不要对这么大的XML文件使用DOM (1.1 on听起来很可怕)。

如果您使用的是Java6,请查看javax.xml.transform.saxjavax.xml.transform.stax包作为参考,您的解决方案应该实现什么才能正常工作。

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

https://stackoverflow.com/questions/2445275

复制
相关文章

相似问题

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