Ошибки нехватки памяти с permsize 1024M и размером кучи 2048M для XML-файлов, обрабатываемых внутри цикла for-each в XPL, каждый из которых имеет размер около 4,5 МБ на диске.

У меня есть несколько циклов for-each, которые я использую для перебора элементов XML-файла конфигурации очень небольшого размера (2 КБ на диске) для динамического получения исходного URL-адреса и целевого URL-адреса. Затем я извлекаю данные из исходного URL-адреса с помощью URLGenerator (поскольку он выполняет потоковую передачу) и загружаю их в базу данных XML с помощью процессора XForms Submissions. Исходный URL-адрес и целевой URL-адрес вычисляются динамически, и самые внутренние циклы, в которых происходит извлечение и загрузка, происходят в общей сложности около 32 раз, каждый раз с XML-файлом в среднем около 4,5 МБ (макс. около 6 МБ, минимум несколько КБ). ). Каждый раз, когда я пытаюсь это сделать, я получаю сообщение об ошибке нехватки памяти для Tomcat, работающего с щедро выделенными размерами permgen и кучи, JVM 32-разрядная, ОС 32-разрядная; Мне нужен выход из этой ошибки нехватки памяти:

  1. Я думал, что отдельные отправки XForms будут отдельными транзакциями, поэтому они не будут накапливаться, вызывая проблему нехватки памяти.
  2. Есть ли способ выполнить потоковую загрузку с использованием процессора XForms Submissions вместо создания полного документа в памяти?
  3. Я не знаю, поможет ли это, но есть ли способ выполнить агрессивную сборку мусора в Orbeon, чтобы у меня не было проблем с нехваткой памяти?

Если нужно, я могу опубликовать код здесь (для XPL).

Исходный код (в ответ на комментарий, запрашивающий его)


person user557060    schedule 02.06.2011    source источник
comment
Нам нужно увидеть исходный код. Это проблема с джавой?   -  person This    schedule 02.06.2011
comment
Ссылка на исходный код выше (в описании вопроса). Исходный код на самом деле XPL (не java), если это был ваш вопрос. Проблема может быть связана с обработкой памяти в java, Tomcat или Orbeon, или виновником может быть исходный код, пока не знаю.   -  person user557060    schedule 03.06.2011


Ответы (1)


  1. Если вы запустите oxf:xforms-submission внутри цикла, они будут работать независимо, и загрузка 30 документов в цикле займет только память, необходимую для самого большого документа.
  2. Отправка XForms должна иметь полный документ в памяти, чтобы иметь возможность загрузить его; он не поддерживает потоковую передачу (в отличие от oxf:url-generator).
  3. Значение параметра pergen VM по умолчанию часто слишком низкое, поэтому я бы рекомендовал вам попробовать увеличьте пространство для постоянного хранения.
person avernet    schedule 03.06.2011
comment
Вот что меня смущает - пространство permgen установлено на 256м, с макс. permgen установлен на 512m: export CATALINA_OPTS=-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:PermSize=256m -XX:MaxPermSize=512m -Xms128m -Xmx2048m. Что еще я могу сделать? Конечно, файл размером не более 6 МБ не может быть причиной этого - даже 256 м начального распределения должно быть достаточно для этого файла! Действительно ли Orbeon освобождает память, как только отправка XForms завершена - у меня есть подозрение, что независимо от циклов документы сохраняются в памяти (что-то делать с экземпляром ответа по умолчанию = отправка документа)? - person user557060; 03.06.2011
comment
В самом деле, что должно быть достаточно permgen места. Возможно, память не освобождается, что было бы ошибкой. Не могли бы вы создать минимальное приложение (zip с файлами, которые мы можем поместить в resources/apps), чтобы воспроизвести это? Может быть, вы можете разместить это приложение где-нибудь на сервере и вставить ссылку сюда. - person avernet; 04.06.2011