2014-06-26 20 views
26

Chúng tôi đang sử dụng các phantomj để chạy trang kiểm tra qunit của chúng tôi trên máy chủ xây dựng TFS của chúng tôi. phiên bản của chúng ta về runner thử nghiệm được xây dựng từ bên dưới ví dụPhantomjs chết do mức tiêu thụ bộ nhớ cao

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

Trong một khoảng thời số thời điểm kiểm tra tăng từ hàng trăm đến vài ngàn và trên phantomjs ngày đẹp trời bắt đầu rơi. Nó nghĩa đen chết nói rằng tải lên các bãi chứa và khi bạn nhìn thấy các bãi nó 0kb !!

Khi chúng tôi xem xét kỹ hơn về trình thám hiểm quy trình, chúng tôi nhận thấy rằng mức tiêu thụ bộ nhớ của các phantomj tiếp tục tăng lên khi các ảo ảnh đang chạy thử nghiệm và cuối cùng bị hỏng ở đâu đó 833MB.

Có cùng một lượng bộ nhớ đang được Chrome và IE sử dụng! Và có-có thử nghiệm của chúng tôi đã bị rò rỉ bộ nhớ: (Chúng tôi đã cố định nó, sử dụng bộ nhớ được giảm 50% trên chrome và IE và chúng tôi dự kiến ​​các phantomj sẽ xử lý nó ngay bây giờ. tiêu thụ.

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

Theo tài liệu trên phantomjs phiên đống phân bổ chỉ trên gần? có thể đó là lý do tại sao kiểm tra cố định của chúng tôi tiêu thụ ít bộ nhớ trên chrome nhưng không phantomjs? Và cuối cùng làm thế nào để sửa lỗi này? Làm thế nào để làm cho các phantomj giữ các đối tượng thu thập rác để thu gom phân vùng heap?

Cập nhật 1 - 07/28

Chúng tôi đã thực hiện một công việc. Tôi đã sửa đổi kịch bản của mình để thực thi mô-đun thử nghiệm của mình theo mô-đun. Trong vòng lặp sau khi thực hiện tất cả các thử nghiệm cho một mô-đun tôi gọi page.close để nó phát hành bộ nhớ cho mỗi mô-đun và không bao giờ tiếp tục xây dựng đống vật chết. Không đóng câu hỏi này kể từ khi một giải pháp của nó và không phải là một giải pháp. Hy vọng người sáng tạo sẽ sửa lỗi này đôi khi.

+0

Những loại cấu trúc dữ liệu nào bạn đã tải về trang web của bạn tiêu thụ 833MB? Thật điên rồ! Tôi chưa bao giờ nghe nói về một ứng dụng web chiếm nhiều bộ nhớ. –

+0

@CameronTinker Khi ứng dụng chạy độc lập, không quá 90MB và nó vẫn ở đó suốt đời. Một ứng dụng đơn của nó được xây dựng bằng cách sử dụng EmberJS. Tiêu thụ 833MB là trang Á hậu thử nghiệm qunit .. –

Trả lời

10

Có một phương pháp tĩnh, QWebPageSettings::clearMemoryCache, yêu cầu thu gom rác của WebKit. Tuy nhiên, nó xóa tất cả bộ nhớ cache QWebPage cho mọi đối tượng QWebPage đã được khởi tạo và do đó, hiện tại, không phù hợp để bao gồm tùy chọn trong PhantomJS.

Yêu cầu kéo Github có sẵn ở đây:
https://github.com/ariya/phantomjs/pull/11511
Dưới đây là các cuộc thảo luận Google Groups:
https://groups.google.com/forum/#!msg/phantomjs/wIDp9J7B-bE/v5U31_mTbswJ

Cho đến một cách giải quyết là có sẵn, bạn có thể chia tay kiểm tra đơn vị của bạn thành các khối trên các trang riêng biệt. Nó sẽ thay đổi việc thực hiện QtWebkit và cách bộ nhớ/bộ đệm được xử lý trên các đối tượng QWebPage.

Cập nhật tháng 9 năm 2014: https://github.com/ariya/phantomjs/commit/5768b705a0
Dường như hỗ trợ xóa bộ nhớ cache đã được thêm vào, nhưng có ghi chú về nhận xét ban đầu của tôi trong cam kết.

+2

Cảm ơn bạn đã chia sẻ thông tin này @Cameron Tinker –

+1

@lame_coder bạn đã tìm ra cách truy cập đối tượng 'page' từ bên trong bộ thử nghiệm của bạn để gọi phương thức này? Tôi đang chạy vào cùng một vấn đề với Phantom2 và Ember JS. – blimmer

+0

Trong PhantomJS 2.0 thông qua Selenium webdriver 1.2.0 nó là 'webdriver.executePhantomJS (" phantom.page.clearMemoryCache() ", [])'. Tuy nhiên, điều này sẽ không làm việc trên GCing các dom (như Iframes trong một ứng dụng trang duy nhất), nó chỉ xóa trong bộ nhớ cache hình ảnh và như vậy. – NielsK

0

tôi quản lý để làm việc xung quanh nó bằng cách thiết lập cờ/LARGEADDRESSAWARE

Nếu bạn đã cài đặt visual studio, chạy từ một dấu nhắc lệnh visual studio

editbin /LARGEADDRESSAWARE <pathto>/PhantomJS.exe 
Các vấn đề liên quan