2017-08-11 82 views
8

经过Chrome最新和其他浏览器测试。此页面开始timer()每60秒刷新一次。在init()和每refresh(),它从服务器获取数据并在页面中显示相同。我们发现每次刷新都会泄漏大量的MB。angularjs 1.5:如何识别什么是泄漏和修复泄漏?

  1. 现在,我该如何识别正在泄漏

  2. 的特定对象和/或DOM节点。一旦我确定从#1对象/节点,我怎么去修复泄漏?

是否有任何书籍,很好的教程,将涵盖上述Angularjs 1.5?

+1

一个好的开始就是在你的开发者工具(或更新的Chrome版本中的内存)中试用Profiler。 –

+0

我需要更多详细信息才能使其正常工作。我搜索了“如何使用Chrome开发工具查找内存泄漏”,并能够识别分离的DOM对象。但从那里,我无法得到任何具体的东西。 – anjanb

回答

1

您可能找到了https://developers.google.com/web/tools/chrome-devtools/memory-problems/http://www.dwmkerr.com/fixing-memory-leaks-in-angularjs-applications/,因为这里没有更详细的资源。

DOM节点只能当有从任一页面的DOM树或JavaScript代码未被引用被垃圾收集。一个节点被从DOM树中移除时被认为是“分离的”,但是一些JavaScript仍然引用它。分离的DOM节点是内存泄漏的常见原因。

  1. 如果你不拿着计时器的参考,但在每次刷新时创建一个新的计时器 - 泄漏,可解通过重用$timeout

  2. 结帐 - CTRL + F $scope is retained by a context for a closure.上第二次提供链接。这个用例解释的与你所拥有的很相似。另外的文章中:

我们可以开启该功能,并检查它的问题。有一个$ http.get作为使用$ scope的闭包,但令人震惊的是有一个$ interval被注册为每10秒运行一次,永远不会注销。间隔回调使用另一个$ http.get,并使用$ scope的闭包。这就是问题。

如果没有上述那么在这里也适用的开放问题AngularJSmemory leak作为关键字列表:

https://github.com/angular/angular.js/issues?utf8=%E2%9C%93&q=is%3Aopen%20memory%20leak

1

我不知道这是否会帮助你是不是(也许你已经看过),但值得一提的是。我在之前的应用程序中遇到过类似的问题,即在每个ajax请求期间持续复制对象。所以从页面的负载我将使用大约50MB的内存,但是在做了10-15个Ajax调用之后,内存将会飞速增长到1GB以上。

我能够使用chrome开发工具 - >内存选项卡识别和解决问题。通过这里您可以记录内存的分配配置文件并获得堆快照。所以,为了您的情况,我可能会将计时器减少到5或10秒以进行测试,然后运行这些分析器。您将能够了解正在调用哪些方法以及花费多少。

希望这会有所帮助。