【问题标题】:Phantomjs dies by high memory consumptionPhantomjs 因高内存消耗而死
【发布时间】:2014-08-17 15:45:54
【问题描述】:

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

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

在一段时间内,测试的数量从数百增加到数千,并且在好日子 phantomjs 开始崩溃。它真的死了说上传转储,当你看到转储时它是 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 以便它释放每个模块的内存,并且永远不会继续构建对象的死堆。没有关闭这个问题,因为它是一种解决方法而不是解决方案。希望创作者能在某个时候解决这个问题。

【问题讨论】:

  • 你在你的网页上加载了什么样的数据结构来消耗833MB?太疯狂了!我从未听说过 Web 应用程序会占用这么多内存。
  • @CameronTinker 当应用程序独立运行时,它不会超过 90MB,并且会在其生命周期内保持不变。它是一个使用 EmberJS 构建的单页应用程序。消耗 833MB 是 qunit test runner page ..

标签: javascript memory-leaks tfs phantomjs


【解决方案1】:

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

如果您安装了 Visual Studio,请从 Visual Studio 命令提示符运行

editbin /LARGEADDRESSAWARE <pathto>/PhantomJS.exe

【讨论】:

    【解决方案2】:

    有一个静态方法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
    似乎添加了对清除内存缓存的支持,但在提交中有一条关于我的原始评论的注释。

    【讨论】:

    • 感谢@Cameron Tinker 分享此信息
    • @lame_coder 你知道如何从你的测试套件中访问page 对象来调用这个方法吗?我在使用 Phantom2 和 Ember JS 时遇到了同样的问题。
    • 在 PhantomJS 2.0 到 Selenium webdriver 1.2.0 它是webdriver.executePhantomJS("phantom.page.clearMemoryCache()", [])。但是,这不适用于对 dom 进行 GC(如单页应用程序中的 iframe),它只会清除内存中缓存的图像等。
    • @NielsK 你知道它在 1.9.8 中是否可用吗?我尝试了page.clearMemoryCache()phantom.page.clearMemoryCache(),但在这两种情况下我都得到了ReferenceError: Can't find variable:
    • @Erin_Drummond 不,该功能已与 uograde 一起添加到 PhantomJS 2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 2021-01-10
    • 2019-02-24
    • 2017-10-30
    相关资源
    最近更新 更多