У нас есть многопоточное приложение, которое используется для обхода данных с разных сайтов. Мы используем 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, я пробовал:
- Переход от среды выполнения Java (TM) SE к среде выполнения OpenJDK.
- Используется webClient.closeAllWindows(); где это необходимо.
Обнаружили, что не повезло с этими изменениями. Приложение использует всю кучу менее чем за 10 минут. Как мы можем решить эту проблему с недостатком памяти?
Редактировать: После обновления до htmlunit-2.16.jar мы получаем улучшения в сборке мусора. (Наряду с OpenJDK)
До: (С HtmlUnit-2.12.jar и Java (TM) SE Runtime Environment (сборка 1.7.0_79-b15))
Есть версия HtmlUnit вызывающая проблема?
Редактировать В старом коде приложения, WebClient были не закрыты в каком-то конкретном случае, вызвавшего объекты WebClient должны быть созданы и, следовательно, размер кучи увеличивается. Но даже после закрытия веб-клиента и его нулевого значения проблема с кучей сохраняется.
Как решить эту проблему с кучей памяти?
4 ГБ ОЗУ кажется довольно низким для высокопроизводительного веб-приложения. Можете ли вы увеличить до 8 ГБ или даже 16 ГБ? –
У нас были такие же реализации с 2 ГБ ОЗУ и 20 потоков, и мы никогда раньше не замечали высокий процессор. – user2627846
Посмотрите на свой код ниже 'new ThreadPoolExecutor (20, 40, 10000, TimeUnit.SECONDS, workQueue)' вы используете 20 потоков, пока очередь не достигнет своей емкости. После этого число потоков может увеличиться до 40. –