了解AngularJS和Google Chrome内存管理

时间:2014-03-08 14:12:57

标签: angularjs google-chrome memory-leaks garbage-collection single-page-application

我想知道为什么 - 即使在使用AngularJS的简单SPA应用程序中,似乎也存在DOM泄漏。我可能会误解这个,但我看待这个的方式是分配的DOM元素没有被正确释放。 复制程序如下:

  • 使用简单的AngularJS应用程序
  • 导航到屏幕截图中的页面
  • 在开发者工具中打开时间轴记录
  • 强制垃圾收集
  • 添加项目,然后将其删除
  • 强制垃圾收集
  • 重复最后两步至少3次

在屏幕截图中,您可以看到在添加项目并将其删除后,垃圾回收后似乎还有两个DOM元素(从502跳转到504个DOM元素)。

我希望有人能够在深入研究正在发生的事情之前对此有所了解。这个测试的原因是我正在研究的AngularJS SPA更加复杂,而且它似乎也在泄漏内存。

simple angularjs memory consumption timeline

1 个答案:

答案 0 :(得分:1)

我现在正在做类似的事情。我注意到的是几件事: 1)查看$(window).fn()的任何用法 - 其中fn是window对象上的任何函数;如果您不止一次这样做,那么您将多个事件处理程序添加到全局对象中会导致内存泄漏

2)$ rootScope。$ watch() - 同样,如果您不止一次这样做(比如,在加载指令时),那么您需要向全局对象添加多个处理程序

3)在我的测试中(我在两页之间来回),在垃圾收集开始之前,Chrome似乎消耗了大量内存(在我的情况下,几乎是1GB)。也许当你点击&#时34;垃圾收集" chrome实际上不是在做GC吗?或者它是javacsript的GC而不是dom元素?

4)如果你向dom元素添加一个事件处理程序,然后从dom中删除它,处理程序永远不会得到GC。