更改 ng 视图内容后,不会释放保留的内存

Memory reserved is not freed after changing ng-view content

本文关键字:释放 保留 内存 视图 ng 更改      更新时间:2023-09-26

我在AngularJS中实现了音频播放器应用程序,但它消耗了大量的RAM。我正在执行的操作顺序如下:

  1. 路由到登录页面
  2. 登录,然后转到下一页
  3. 注销
  4. 多次
  5. 重复 1 到 3 的步骤

令人惊讶的是,第一步的内存是 38 MB,然后在第二步之后增加到 211 MB,第三步之后增加到 249 MB,依此类推,因此它是累积的,并且在任何 ng-view 更改后都不会释放内存

这是我的代码示例:

索引.html

<html ng-app="myApp">
   <head><!-- application dependencies (js and css files) --></head>
   <body>
      <div ng-view></div>
   </body>
</html>

应用程序.js文件

var app = angular.module('myApp', ['ngRoute']);
app.config(['$routeProvider', '$locationProvider', '$httpProvider',
    function ($routeProvider, $locationProvider, $httpProvider) {
        $routeProvider.when('/login', {
            templateUrl: 'login.html',
            controller: 'loginController'
        });
        $routeProvider.when('/', {
            templateUrl: 'home.html',
            resolve:{/** resolve function for login checking */}
            controller: 'homeController'
        });
    }]);

我尝试了此问题中清除的清理$templateCache的解决方案,但在我的情况下它不能成为解决方案,因为我尝试了它,问题不在于模板本身,而是 DOM 和控制器数据有问题

我如何处理这个内存问题,所以当我在ng-view中更改视图时,它不会消耗所有这些内存(因为它不是模板大小)

更新 1:

在解析登录数据并在注销后检查服务器的响应后,我在使用 $location.path('/route') 登录或注销时在视图之间切换,所以这可能是问题所在吗?

更新 2:

我创建了一个 plunker,可以模拟切换视图过多时内存的增加(当然这不是实际数字,因为它是模拟)

有趣的是,似乎loginController没有从内存中清除。您可能需要尝试自己触发$destroy()以清除该控制器。这假定它被加载了多次。

其他一些可能有帮助的资源:关于$destroy()的博客文章有点类似的 github 问题

我认为您需要实现基于 angular-websocket 的方法,类似于 Trello,在一定时间后,您要求用户更新他们的页面以接收系统的新更新或在他们的套接字连接超时时刷新?根据您的设置,您可能会发现本教程很有用:使用 Socket.IO 编写 AngularJS 应用程序。

阅读您所提出的问题的已接受答案的最新更新。