Phantomjs因内存消耗过高而崩溃

26

我们正在使用PhantomJS在TFS构建服务器上运行QUnit测试页面。我们的测试运行器版本是基于以下示例构建的:

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

随着时间的推移,测试数量从几百个增加到了数千个,在一个晴朗的日子里,phantomjs开始崩溃。它会直接死机并提示上传转储文件,但当你查看转储文件时,文件大小为0kb!
当我们在进程资源管理器中仔细查看时,我们发现phantomjs的内存消耗随着运行测试而不断增加,并最终在833MB左右崩溃。
是的,chrome和IE也使用了同样数量的内存!而且,是的,我们的测试存在内存泄漏:(。我们已经修复了它,在Chrome和IE上,内存利用率降低了50%,我们期望phantomjs现在能够处理它。但是没有,phantomjs仍然会崩溃,进程资源管理器显示相同的内存消耗。

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

根据上述文档,phantomjs仅在关闭时释放堆分配?这可能是我们的固定测试在Chrome上消耗的内存较少但在phantomjs上不少的原因吗?最后如何解决?如何使phantomjs继续垃圾回收JavaScript对象以减少堆分配?
更新1-07/28
我们采取了一个解决方法。我修改了我的脚本以逐个模块执行我的测试。在循环中,在执行完一个模块的所有测试后,我调用page.close以释放每个模块的内存,并且永远不会保留死堆对象的构建。不关闭此问题,因为它只是一个解决方法而不是解决方案。希望创作者能够在未来修复这个问题。

你的网页上加载了哪些数据结构来消耗833MB的内存?太疯狂了!我从未听说过一个Web应用程序占用那么多的内存。 - Cameron Tinker
@CameronTinker 当应用程序独立运行时,它的大小不超过90MB,并且在其生命周期内保持不变。它是使用EmberJS构建的单页面应用程序。833MB的消耗是qunit测试运行器页面的大小。 - lame_coder
2个回答

10
有一个静态方法,QWebPageSettings::clearMemoryCache,可以调用WebKit的垃圾回收。然而,它会清除所有QWebPage内存缓存,对于每个已实例化的QWebPage对象,因此目前不适合作为PhantomJS选项包含在内。
Github的拉取请求在这里:
https://github.com/ariya/phantomjs/pull/11511
以下是Google Groups讨论:
https://groups.google.com/forum/#!msg/phantomjs/wIDp9J7B-bE/v5U31_mTbswJ 在找到解决方法之前,您可能需要将单元测试分成不同页面的块。这将需要更改QtWebkit的实现以及如何处理跨QWebPage对象的内存/缓存。
更新:2014年9月: https://github.com/ariya/phantomjs/commit/5768b705a0
看起来添加了清除内存缓存的支持,但提交中有关于我的原始评论的说明。

2
感谢@Cameron Tinker分享这个信息。 - lame_coder
1
@lame_coderпјҢдҪ и§ЈеҶідәҶеҰӮдҪ•д»ҺжөӢиҜ•еҘ—件еҶ…и®ҝй—®pageеҜ№иұЎе№¶и°ғз”ЁиҜҘж–№жі•зҡ„й—®йўҳеҗ—пјҹжҲ‘еңЁдҪҝз”ЁPhantom2е’ҢEmber JSж—¶д№ҹйҒҮеҲ°дәҶеҗҢж ·зҡ„й—®йўҳгҖӮ - blimmer
在PhantomJS 2.0通过Selenium webdriver 1.2.0中,它是webdriver.executePhantomJS("phantom.page.clearMemoryCache()", [])。然而,这不适用于GCing dom(例如单页应用程序中的Iframes),它只清除内存中缓存的图像等内容。 - NielsK
@NielsK,你知道它在1.9.8版本中是否可用吗?我尝试了page.clearMemoryCache()phantom.page.clearMemoryCache(),但两种情况下都出现了ReferenceError: Can't find variable:的错误。 - Erin Drummond
1
@Erin_Drummond 不,这个功能是在升级到PhantomJS 2时添加的。 - NielsK

1
我通过设置 /LARGEADDRESSAWARE 标志成功地解决了这个问题。
如果您已安装 Visual Studio,请从 Visual Studio 命令提示符中运行。
editbin /LARGEADDRESSAWARE <pathto>/PhantomJS.exe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接