2010-03-15 2 views
1

Я запускаю следующую команду в unix-окне.java OutOfMemoryError

ява -Xms3800m -Xmx3800m org.apache.xalan.xslt.Process -out Cust.txt -в test13l.xml -xsl CustDetails.xsl

Это команда Java, которая вызывает процессор Xalan для синтаксического анализа через xml-файл (test131.xml), используя таблицу стилей xsl (CustDetails.xsl) и возвращает Cust.txt.

Команда работает нормально и генерируется выход. Для обработки xml-файла размером 1,1 ГБ требуется 12 минут. Для обработки файла размером 1,44 ГБ требуется 22 минуты. Однако, когда я пытаюсь обработать размер файла 1,66 ГБ, оно ошибки вне с следующим сообщением:

(Местонахождение Неизвестная ошибка) Ошибка 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

ответ

1

Вы используете 64-битный Java-процесс или 32-разрядный Java-процесс? Сколько у вас памяти в системе? Какова полная трассировка стека для вашего OOM? В какой версии JVM вы работаете? Вы всегда можете запустить JConsole и выгрузить кучу и открыть ее в инструменте, таком как Eclipse MAT, чтобы узнать, какие объекты занимают кучу. В зависимости от вашей версии JVM вы можете запустить свой процесс с помощью -XX: + HeapDumpOnOutOfMemory и открыть дамп после завершения процесса Java.

0

Изготовление гигантского дерева DOM в памяти - это не путь; найти способ подачи XSL Transformer с помощью XML-событий, таких как SAX или StAX API. Никогда не используйте DOM API для XML-файлов, которые массивны (1.1GB звучит страшно).

Если вы используете Java 6, посмотрите на пакеты javax.xml.transform.sax и javax.xml.transform.stax для справки о том, что должно было бы реализовать ваше решение, чтобы это работало.

2

Xalan может использовать парсер DOM или SAX под ним.

DOM parsers обычно пытаются прочитать весь файл за один раз и построить дерево из него, потребляя много памяти на больших файлах.

Анализаторы SAX, с другой стороны, провоцируют события при разборе и, следовательно, не требуют сохранения всего файла в памяти (но вы не можете получить доступ к дереву так же легко).

Убедитесь, что ваш Xalan использует SAX-парсер под ним. Вы можете найти описание, как это сделать здесь: http://xml.apache.org/xalan-j/usagepatterns.html#sax