如何减少/消除 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 应用程序中的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Angular 消除 Spring Boot 中的 CORS 错误? [复制]

减少 Angular 应用程序的内存使用率

避免、发现和消除 Cocoa 中的内存泄漏

分析 ThreadLocal 内存泄漏问题

如何消除其他库引起的内存泄漏?

减少 Docker 和 Kubernetes 中的 JVM 内存占用