在非常简单的Ember 1.13.3 app中路由转换时内存泄漏

时间:2015-09-01 13:29:11

标签: javascript ember.js memory-leaks

最近,我的任务是在我们的Ember应用程序中查找内存泄漏。经过一天左右的时间,我得出结论,在每次路线过渡后,Ember似乎正在泄漏整个集装箱。

我制作了一个玩具应用来证明这一点,你可以在这里找到:https://github.com/arthare/leakyEmberApp

概述:

在应用程序中,有route1和route2。

Route1.hbs看起来像这样(它链接到route2,并有一些文本):

{{#link-to 'route2'}}Next{{/link-to}} <-- Click that guy

...some instructional, completely non-dynamic text...

Route2.hbs看起来像这样:

{{#link-to 'route1'}}Go back{{/link-to}} <-- Now click that guy

正如你所看到的,这距离一个'#hello world"应用

错误:

  1. 打开chrome dev工具
  2. 转到时间轴视图
  3. 捕获内存
  4. 开始录制
  5. 在应用程序中,单击链接从route1移至route2并再次返回几十次
  6. 停止录制,并注意DOM节点数量一直在攀爬。如果您开始新的录制,DOM节点计数将从高位开始(也就是说,Chrome不会在录制会话之间进行清理)。
  7. 有谁知道我能做些什么呢?在玩具应用程序中,后果相当小,但在我们的真实应用程序中,它正在泄漏非常重要的组件,每次转换吸收500kb-1mb的内存。玩具应用程序也有一个极其漏洞的版本(提交4fd324f829),其中每个转换都会泄漏一个大的500元素组件。

    Firefox也漏掉了,所以它不仅仅是一个镀铬的东西。

    绿色是DOM节点计数,蓝色是JS堆大小。如果添加一个相当大的组件,那么DOM节点计数会按比例增长。 Timeline screenshot

1 个答案:

答案 0 :(得分:1)

通过升级到2.0.1在玩具应用中解决了这个问题。所以看起来它在应用程序的当前版本和2.0.1之间的某个时间被修复。

追踪版本:

  • 已在1.13.9中修复
  • 已在1.13.8中修复
  • 已在1.13.7
  • 中修复
  • 已在1.13.4中修复
  • 在1.13.3中删除