2010-03-15 75 views
1

我在unix框上运行以下命令。java OutOfMemoryError

的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不知道我能做些什么。

非常感谢您的帮助。

+0

设置Xms和Xmx参数无法确保JVM自己将分配的内存量分配给堆。看看下面 http://stackoverflow.com/questions/171205/java-maximum-memory-on-windows-xp http://www.unixville.com/~moazam/ 链接也许你应该考虑其他的优化......比如使用SAX解析器并直接存储到文件中。 – saugata 2010-03-15 06:02:23

回答

1

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

0

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

如果您使用的是Java 6,请参阅包javax.xml.transform.saxjavax.xml.transform.stax以供参考,请参阅您的解决方案应该如何实现此功能。

2

Xalan可以在下面使用DOM或SAX解析器。

DOM解析器通常尝试一次读取整个文件并从中构建一个树,在大文件上占用大量内存。

SAX解析器在解析时触发事件,因此不需要将整个文件保存在内存中(但无法轻松访问树)。

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