2015-09-09 2 views
1

У нас есть многопоточное приложение, которое используется для обхода данных с разных сайтов. Мы используем htmlunit для загрузки контента для некоторых веб-сайтов. Проблема с ошибкой «Вне памяти» неожиданно появилась. Наше приложение использует 30 потоков на сервере развертывания.Как разрешить кучу Java-кучи с htmlunit

Мы используем следующие в наших внедрениях:

htmlunit-2.12.jar 
htmlunit-core-js-2.12.jar 
Java: Java(TM) SE Runtime Environment (build 1.7.0_79-b15) 

Для кота мы используем следующие параметры:

-Xms1024m -Xmx3584m 
-XX:+UseConcMarkSweepGC 
-XX:PermSize=256m -XX:MaxPermSize=256m 

Бег на: CentOS релиз 6.3 (4 Гб RAM)

Из различных предложение о куче памяти Java, связанное с htmlunit, я пробовал:

  1. Переход от среды выполнения Java (TM) SE к среде выполнения OpenJDK.
  2. Используется webClient.closeAllWindows(); где это необходимо.

Обнаружили, что не повезло с этими изменениями. Приложение использует всю кучу менее чем за 10 минут. Как мы можем решить эту проблему с недостатком памяти?

Редактировать: После обновления до htmlunit-2.16.jar мы получаем улучшения в сборке мусора. (Наряду с OpenJDK)

enter image description here

До: (С HtmlUnit-2.12.jar и Java (TM) SE Runtime Environment (сборка 1.7.0_79-b15)) enter image description here

Есть версия HtmlUnit вызывающая проблема?

Редактировать В старом коде приложения, WebClient были не закрыты в каком-то конкретном случае, вызвавшего объекты WebClient должны быть созданы и, следовательно, размер кучи увеличивается. Но даже после закрытия веб-клиента и его нулевого значения проблема с кучей сохраняется.

Как решить эту проблему с кучей памяти?

+0

4 ГБ ОЗУ кажется довольно низким для высокопроизводительного веб-приложения. Можете ли вы увеличить до 8 ГБ или даже 16 ГБ? –

+0

У нас были такие же реализации с 2 ГБ ОЗУ и 20 потоков, и мы никогда раньше не замечали высокий процессор. – user2627846

+0

Посмотрите на свой код ниже 'new ThreadPoolExecutor (20, 40, 10000, TimeUnit.SECONDS, workQueue)' вы используете 20 потоков, пока очередь не достигнет своей емкости. После этого число потоков может увеличиться до 40. –

ответ

0

Как вы храните данные при сканировании?

Вы сохраняете все это в памяти? Или вы пишете на диск/базу данных, когда идете?

Если вы храните все в памяти, это, скорее всего, проблема.

Кроме того, вы обрабатываете только текст/html или работаете также с изображениями?

+0

Мы записываем его в базу данных, как только получаем результат. – user2627846

+0

Могу ли я увидеть фрагмент кода, который отправляет задачи в пул потоков? Загружаете ли вы изображения в память (ByteArrayInputStream)? –

+0

Мы не загружаем изображения во время сканирования. Мы используем ThreadPoolExecutor для исключения потоков. 'ThreadPoolExecutor (int corePoolSize, int maximumPoolSize, long keepAliveTime, единица TimeUnit, BlockingQueue workQueue)' – user2627846

Смежные вопросы