我在单元测试期间在Ember-CLI应用程序中发生内存泄漏。
我有一个非常大的测试套件,包含300多个测试。当我立即在套件中运行所有测试时,Chrome会达到每个标签1.6 GB的内存限制并崩溃。显然这是不可接受的。
我已经从运行单个测试中收集了内存配置文件。测试通过完成后,我看到很多Class
的实例,不确定它们是什么。还有一些HTMLBarsMorph
个对象。我在下面的内存快照中附上了一些屏幕截图。
问题:如何诊断Ember-CLI应用程序中的泄漏?具体来说,我怎么能找出堆上剩下的垃圾究竟是什么 - Class
,HTMLBarsMorph
的实例看起来都很平常,所以它没有多大帮助。
似乎某些对象的_state
设置为"destroying"
。这听起来不对,不是吗?我猜他们应该处于"destroyed"
状态,如果有的话。
修改:
进行了以下额外的实验:
重复100次访问主页的测试,然后退出。存在内存泄漏。
重复执行1000次仅运行beforeEach
,afterEach
和assert.ok(true)
的测试。这次没有泄漏。
这告诉我这与应用程序被销毁后呈现/布局所需的数据剩余有关。这似乎与我在内存转储中看到的一致。
编辑2 :
使用内存快照的比较,我能够找到一些候选人来解决泄漏的根本原因。以下是一些候选人:
快照由10次测试运行分隔,以使泄漏对象更加明显。第一张图片展示了最有可能的罪魁祸首:
当我在测试中没有调用visit()
时,第二组快照中没有泄漏: