2014-06-26 13 views
26

Używamy phantomjs do uruchomienia naszej strony testów qunit na naszym serwerze budowania TFS. Nasza wersja testu biegacza jest zbudowany z poniżej przykładPhantomjs umiera przez wysokie zużycie pamięci

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

Przez pewien okres czasu od liczby testów wzrosła od kilkuset do kilku tysięcy, a na piękny dzień phantomjs zaczął upaść. Dosłownie umiera mówiąc przesłać zrzut i kiedy zobaczysz zrzut to 0kb !!

Kiedy bliżej przyjrzeliśmy się temu procesowi odkryliśmy, że zużycie pamięci przez phantomjs wciąż rośnie, ponieważ phantomjs uruchamia testy i ostatecznie zawiesza się w 833 MB.

Tak, ta sama ilość pamięci była używana przez chrome i IE! I tak-tak, nasze testy były nieszczelne :(Naprawiliśmy to, wykorzystanie pamięci zostało obniżone o 50% na chrome i IE i spodziewaliśmy się, że phantomjs sobie z tym poradzi, ale nie, phantomjs wciąż się zawiesza, proces explorer pokazuje tę samą pamięć zużycie.

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

Według powyższej dokumentacji phantomjs uwalnia sterty alokacji tylko na zamknięciu? Czy to może być powód, dlaczego nasze stałe badanie spożywane mniej pamięci na chromie ale nie phantomjs? I wreszcie, jak to naprawić? Jak czy phantomjs nadal gromadzi śmieci zbierając obiekty javascript, aby zmniejszyć przydziały sterty?

Aktualizacja 1 - 07/28

Pobraliśmy się. Zmodyfikowałem skrypt, aby wykonać moduł testowy według modułu. W pętli po wykonaniu wszystkich testów dla modułu wołam page.close, więc zwalnia pamięć dla każdego modułu i nigdy nie buduje martwego stosu obiektów. Nie zamykając tego pytania od czasu rozwiązania problemu, a nie rozwiązania. Nadzieja twórców naprawi to kiedyś.

+0

Jakie rodzaje struktur danych nie zostały załadowane Twoja strona zużywa 833 MB? To szalone! Nigdy nie słyszałem o aplikacji internetowej zajmującej tyle pamięci. –

+0

@CameronTinker Gdy aplikacja działa samodzielnie, jej nie więcej niż 90 MB i pozostaje tam przez całe życie. Jest to aplikacja na jedną stronę zbudowana przy użyciu EmberJS. Zużycie 833MB to strona testu biegowego qunit .. –

Odpowiedz

10

Istnieje metoda statyczna, QWebPageSettings::clearMemoryCache, która wywołuje wyrzucanie elementów WebKit. Jednak czyści całą pamięć podręczną QWebPage dla każdego utworzonego obiektu QWebPage i dlatego jest obecnie nieodpowiednia do włączenia jako opcja w PhantomJS.

Żądanie ciągnąć Github jest dostępny tutaj:
https://github.com/ariya/phantomjs/pull/11511
Oto dyskusja Google Groups:
https://groups.google.com/forum/#!msg/phantomjs/wIDp9J7B-bE/v5U31_mTbswJ

Do obejście jest dostępny, można zerwać swoje testy jednostkowe w blokach na oddzielnych stronach. Będzie to wymagało zmiany implementacji QtWebkit oraz sposobu obsługi pamięci/pamięci podręcznej w obiektach QWebPage.

Aktualizacja wrzesień 2014: https://github.com/ariya/phantomjs/commit/5768b705a0
To wygląda wsparcie dla wyczyszczenie pamięci cache Dodano ale jest notatka o moim oryginalnym komentarzem w popełnić.

+2

Dzięki za podzielenie się tymi informacjami @Cameron Tinker –

+1

@lame_coder czy wiesz, jak uzyskać dostęp do obiektu 'page' z zestawu testów, aby wywołać tę metodę? Występuje ten sam problem z Phantom2 i Ember JS. – blimmer

+0

W PhantomJS 2.0 przez Selenium webdriver 1.2.0 jest to 'webdriver.executePhantomJS (" phantom.page.clearMemoryCache() ", [])'. Jednak to nie zadziała w GCing the dom (jak Iframes w jednej aplikacji strony), to po prostu czyści obrazy w pamięci podręcznej i takie. – NielsK

0

udało mi się obejść ustawiając flagę/LARGEADDRESSAWARE

Jeśli visual studio zainstalowany, należy uruchomić z wiersza polecenia visual studio

editbin /LARGEADDRESSAWARE <pathto>/PhantomJS.exe 
Powiązane problemy