加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angularjs – 如何捕捉内存泄漏在Angular应用程序?

发布时间:2020-12-17 08:49:58 所属栏目:安全 来源:网络整理
导读:我有一个webapp写的AngularJS基本上轮询一个API到两个端点。所以,每一分钟,它轮询,看看有没有什么新的。 我发现它有一个小的内存泄漏,我已尽力找到它,但我不能这样做。在这个过程中,我已经设法减少我的应用程序的内存使用,这是伟大的。 没有做任何其
我有一个webapp写的AngularJS基本上轮询一个API到两个端点。所以,每一分钟,它轮询,看看有没有什么新的。

我发现它有一个小的内存泄漏,我已尽力找到它,但我不能这样做。在这个过程中,我已经设法减少我的应用程序的内存使用,这是伟大的。

没有做任何其他事情,每次轮询可以看到内存使用率的峰值(这是正常的),然后它应该下降,但它总是增加。我把数组的清理从[]更改为array.length = 0,我认为我确信引用不会持久,所以它不应该保留任何这一点。

我也试过这个:https://github.com/angular/angular.js/issues/1522

但没有运气…

所以,这是两个堆之间的比较:

大多数泄漏似乎来自(array),如果我打开,是通过解析API调用返回的数组,但我确信他们没有被存储:

这基本上是结构:

poll: function(service) {
  var self = this;
  log('Polling for %s',service);

  this[service].get().then(function(response) {
    if (!response) {
      return;
    }

    var interval = response.headers ? (parseInt(response.headers('X-Poll-Interval'),10) || 60) : 60;

    services[service].timeout = setTimeout(function(){
      $rootScope.$apply(function(){
        self.poll(service);
      });
    },interval * 1000);

    services[service].lastRead = new Date();
    $rootScope.$broadcast('api.'+service,response.data);
  });
}

基本上,假设我有一个卖方服务,所以,这将是服务变量的值。

然后,在主视图中:

$scope.$on('api.sellings',function(event,data) {
  $scope.sellings.length = 0;
  $scope.sellings = data;
});

并且视图有一个ngRepeat根据需要呈现。我花了很多时间试图自己想出这一点,我不能。我知道这是一个困难的问题,但是,有谁有任何想法如何跟踪这?

编辑1 – 添加promise showcase:

这是两个服务使用的函数makeRequest:

return $http(options).then(function(response) {
    if (response.data.message) {
      log('api.error',response.data);
    }

    if (response.data.message == 'Server Error') {    
      return $q.reject();
    }

    if (response.data.message == 'Bad credentials' || response.data.message == 'Maximum number of login attempts exceeded') {
      $rootScope.$broadcast('api.unauthorized');
      return $q.reject();
    }

    return response;
    },function(response) {
    if (response.status == 401 || response.status == 403) {
      $rootScope.$broadcast('api.unauthorized');
    }
});

如果我注释掉$ scope。$ on(‘api.sellings’)部分,泄漏仍然存在,但下降到1%。

PS:我使用最新的Angular版本到目前为止

编辑2 – 在图像中打开(数组)树

它的一切都像这样,所以它是相当无用的imho

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读