如何减少/消除 Angular 应用程序中的内存泄漏
Posted
技术标签:
【中文标题】如何减少/消除 Angular 应用程序中的内存泄漏【英文标题】:How to reduce/remove memory leaks in Angular application 【发布时间】:2014-04-19 07:12:56 【问题描述】:我正在优化我的大Angular App
。我发现Google DevTools
非常适合检测问题。由于我刚刚开始了解DevTools
,我对内存泄漏感到非常困惑。
当我在我的应用程序中来回移动到不同页面时,配置文件堆快照大小一次又一次地增加,所以我认为有些对象没有被 GC 清理,这就是我的应用程序在一段时间后变慢的原因如何解决这个问题。请帮忙。
注意
这是我使用 DevTools 所理解的,如果我错了,请纠正我。欢迎提出其他建议。
到目前为止我用过的
-
AngularOnce 指令用于在需要时减少监视。
QuickList 指令将 ng-repeat 替换为 quick-ng-repeat。
InView 指令,用于处理大型列表,因此我正在删除不在视口中的 DOM。
ngInfiniteScroll 指令的延迟加载方法。
【问题讨论】:
这是一个很好的例子,说明您需要提供什么样的信息才能让某人能够提供一个体面的答案:***.com/questions/20654684/… 对此答案的更新——现在 angular 1.3.x 已经发布,您可以在大多数情况下使用::
bind-once 方法,而不是添加另一个依赖项来处理这个问题。跨度>
如果您使用 AngularUI 路由器,请注意它的内存泄漏。 github.com/angular-ui/ui-router/issues/545
【参考方案1】:
删除绑定以避免内存泄漏,使用范围 $destroy() 方法。
注意:
Angular 内存泄漏最可能的罪魁祸首是 你的指令。如果您在指令中附加事件侦听器 使用 JQuery 插件,后者将保留对您的 DOM 的引用 即使在 Angular 删除了它自己对 DOM 的引用之后,这意味着 它永远不会被浏览器垃圾收集,反过来 意思是你记忆中的“分离的 DOM 树”
在您的指令中保持练习解除 jQuery 事件的绑定。 $destory 方法,可用于在执行之前清理 DOM 绑定 元素已从 DOM 中移除。
$scope.$on("$destroy",function()
$( window ).off( "resize.Viewport" );
);
不要忘记在你的 $destroy 事件中取消 $timeout 计时器 AngularJS
$scope.$on("$destroy",function( event )
$timeout.cancel( timer );
);
【讨论】:
而here是你提到的全文。 Linky 遭受链接腐烂,网站已失效,但是,Wayback 已将其存档。以上是关于如何减少/消除 Angular 应用程序中的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章