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




1 Answers

Существует статический метод 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
Похоже, добавлена ​​поддержка для очистки кеша памяти, но есть заметка о моем исходном комментарии в фиксации.

Мы используем 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

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




Related

javascript memory-leaks tfs phantomjs