Подтвердить что ты не робот

Phantomjs умирает за счет большого объема памяти

Мы используем phantomjs для запуска нашей страницы тестов qunit на нашем сервере сборки TFS. Наша версия тестового бегуна построена из приведенного ниже примера.

https://github.com/ariya/phantomjs/blob/master/examples/run-qunit.js

С течением времени количество тестов увеличилось с сотен до нескольких тысяч, а в прекрасный день фантомцы начали рушиться. Он буквально умирает, говоря, что загружает дамп, и когда вы видите дамп, это 0kb!!

Когда мы внимательно рассмотрели его в проводнике процессов, мы обнаружили, что потребление памяти phantomjs продолжает расти, поскольку phantomjs запускает тесты и, в конечном счете, сбой где-то 833 МБ.

Да, тот же объем памяти использовался хром и IE! И да, да, наши тесты были утечкой памяти:( Мы исправили это, использование памяти снизилось на 50% на chrome и IE, и мы ожидали, что phantomjs справятся с этим сейчас. Но нет, phantomjs все еще терпит крах, обработчик процессов показывает одну и ту же память потребление.

http://phantomjs.org/api/webpage/method/close.html

Согласно приведенной выше документации, phantomjs освобождает распределение кучи только при закрытии? Может ли это быть причиной того, что наш фиксированный тест потреблял меньше памяти на хроме, но не фантомы? И последний, как это исправить? Как сделать phantomjs сохранить сбор мусора javascript-объектов, чтобы уменьшить выделение кучи?

Обновление 1 - 07/28

Мы занялись работой. Я изменил свой script, чтобы выполнить модуль моих модулей по модулю. В цикле после выполнения всех тестов для модуля я вызываю page.close, чтобы он освобождал память для каждого модуля и никогда не строил мертвую кучу объектов. Не закрывать этот вопрос, так как с его обходным решением, а не решением. Надежды создатели исправит это когда-нибудь.

4b9b3361

Ответ 1

Существует статический метод QWebPageSettings::clearMemoryCache, который вызывает сбор мусора WebKit. Тем не менее, он очищает весь кеш памяти QWebPage для каждого экземпляра объекта QWebPage и поэтому в настоящее время не подходит для включения в качестве опции в PhantomJS.

Запрос на вывоз Github можно найти здесь:
https://github.com/ariya/phantomjs/pull/11511
Здесь обсуждение групп Google:
https://groups.google.com/forum/#!msg/phantomjs/wIDp9J7B-bE/v5U31_mTbswJ

До тех пор, пока не будет доступно обходное решение, вы можете разбить свои модульные тесты на блоки на отдельных страницах. Это приведет к изменению реализации QtWebkit и тому, как память/кеш обрабатывается через объекты QWebPage.

Обновление сентябрь 2014 года: https://github.com/ariya/phantomjs/commit/5768b705a0
Похоже, что добавлена ​​поддержка для очистки кеша памяти, но есть заметка о моем исходном комментарии в коммите.

Ответ 2

Мне удалось обойти это, установив флаг /LARGEADDRESSAWARE

Если у вас установлена ​​визуальная студия, запустите ее из командной строки визуальной студии

editbin /LARGEADDRESSAWARE <pathto>/PhantomJS.exe