web-dev-qa-db-fra.com

Phantomjs meurt par une consommation de mémoire élevée

Nous utilisons phantomjs pour exécuter notre page de tests qunit sur notre serveur de compilation TFS. Notre version de test runner est construite à partir de l'exemple ci-dessous 

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

Au fil du temps, le nombre de tests est passé de centaines à quelques milliers et, par beau temps, les phantomjs ont commencé à tomber en panne. Il meurt littéralement en disant de télécharger le dump et quand vous voyez le dump, c'est 0kb !!

Lorsque nous avons examiné de plus près le processus Explorer, nous avons constaté que la consommation de mémoire de phantomjs ne cessait de croître, phantomjs exécutant des tests et finissant par planter quelque part 833 Mo. 

Oui, chrome et IE utilisaient la même quantité de mémoire! Et oui-oui, nos tests perdaient de la mémoire :(. Nous l'avons corrigé, l'utilisation de la mémoire est réduite de 50% sur chrome et IE et nous nous attendions à ce que phantomjs s'en occupe maintenant. Mais non, les phantomjs continuent de planter, processus Explorer montre la même consommation de mémoire. 

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

Selon la documentation ci-dessus, phantomjs publie l’allocation de tas à la fermeture? Cela pourrait-il être la raison pour laquelle notre test fixe a utilisé moins de mémoire sur chrome, mais pas de phantomjs? Et dernier comment résoudre ce problème? Comment faire en sorte que phantomjs garde les objets javascript collectés afin de réduire l’allocation de tas?

Mise à jour 1 - 07/28

Nous avons pris un travail autour. J'ai modifié mon script pour exécuter mes tests module par module. En boucle après l'exécution de tous les tests pour un module, j'appelle page.close afin qu'il libère la mémoire de chaque module et ne continue jamais à construire le tas d'objets morts. Ne fermez pas cette question puisque c'est une solution de contournement et non une solution. Espérons que les créateurs vont régler ce problème un jour.

26
lame_coder

Il existe une méthode statique, QWebPageSettings::clearMemoryCache , qui appelle le garbage collection de WebKit. Cependant, il efface tout le cache mémoire de QWebPage pour chaque objet QWebPage instancié et ne convient donc pas, à l'heure actuelle, pour être inclus en tant qu'option dans PhantomJS. 

La demande de tirage Github est disponible ici:
https://github.com/ariya/phantomjs/pull/11511
Voici la discussion sur les groupes Google:
https://groups.google.com/forum/#!msg/phantomjs/wIDp9J7B-bE/v5U31_mTbswJ

Jusqu'à ce qu'une solution de contournement soit disponible, vous pouvez diviser vos tests unitaires en blocs sur des pages distinctes. Cela impliquera une modification de l'implémentation de QtWebkit et de la gestion de la mémoire/du cache entre les objets QWebPage. 

Mise à jour de septembre 2014: https://github.com/ariya/phantomjs/commit/5768b705a0
Il semble que le support pour vider le cache mémoire ait été ajouté, mais il y a une note à propos de mon commentaire original dans la validation.

10
Cameron Tinker

J'ai réussi à contourner ce problème en activant l'indicateur/LARGEADDRESSAWARE.

Si Visual Studio est installé, exécutez une invite de commande Visual Studio.

editbin /LARGEADDRESSAWARE <pathto>/PhantomJS.exe
0
Anthony Wieser