ember-qunit中的内存泄漏

时间:2015-10-14 20:50:24

标签: javascript google-chrome ember.js memory-leaks ember-cli

我在单元测试期间在Ember-CLI应用程序中发生内存泄漏。

我有一个非常大的测试套件,包含300多个测试。当我立即在套件中运行所有测试时,Chrome会达到每个标签1.6 GB的内存限制并崩溃。显然这是不可接受的。

我已经从运行单个测试中收集了内存配置文件。测试通过完成后,我看到很多Class的实例,不确定它们是什么。还有一些HTMLBarsMorph个对象。我在下面的内存快照中附上了一些屏幕截图。

问题:如何诊断Ember-CLI应用程序中的泄漏?具体来说,我怎么能找出堆上剩下的垃圾究竟是什么 - ClassHTMLBarsMorph的实例看起来都很平常,所以它没有多大帮助。

似乎某些对象的_state设置为"destroying"。这听起来不对,不是吗?我猜他们应该处于"destroyed"状态,如果有的话。

heap snapshot 1 heap snapshot 2 heap snapshot 3 heap snapshot 4

修改

进行了以下额外的实验:

  1. 重复100次访问主页的测试,然后退出。存在内存泄漏。

  2. 重复执行1000次仅运行beforeEachafterEachassert.ok(true)的测试。这次没有泄漏

  3. 这告诉我这与应用程序被销毁后呈现/布局所需的数据剩余有关。这似乎与我在内存转储中看到的一致。

    编辑2

    使用内存快照的比较,我能够找到一些候选人来解决泄漏的根本原因。以下是一些候选人:

    • 容器
    • TransitionState
    • 注册表
    • 一些DetachedDOM对象,但这本身并不会导致Container泄漏,例如。
    • StarSegment(?)

    快照由10次测试运行分隔,以使泄漏对象更加明显。第一张图片展示了最有可能的罪魁祸首:

    list of leaking objects

    当我在测试中没有调用visit()时,第二组快照中没有泄漏:

    no leaking objects

0 个答案:

没有答案