Phantomjs死于高内存消耗

时间:2014-06-26 17:09:38

标签: javascript memory-leaks tfs phantomjs

我们正在使用phantomjs在我们的TFS构建服务器上运行我们的qunit测试页面。我们的测试运行器版本是根据以下示例构建的

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

在一段时间内,测试次数从数百人增加到数千人,在晴朗的一天,幻影开始崩溃。它真的死了说上传转储,当你看到转储它0kb !!

当我们在进程浏览器上仔细研究它时,我们发现phantomjs的内存消耗不断增加,因为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,以便为每个模块释放内存,并且永远不会继续构建死对象堆。因为它是一个解决方法而不是解决方案,因此不会关闭此问题。希望创作者有时会解决这个问题。

2 个答案:

答案 0 :(得分:10)

有一个静态方法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年9月更新: https://github.com/ariya/phantomjs/commit/5768b705a0
看起来添加了对清除内存缓存的支持,但是在提交中有关于我原始注释的说明。

答案 1 :(得分:0)

我设法通过设置/ LARGEADDRESSAWARE标志来解决它

如果安装了visual studio,请从visual studio命令提示符

运行
editbin /LARGEADDRESSAWARE <pathto>/PhantomJS.exe