2017-10-11 83 views
0

我实施了一个Web应用程序,并使用Google开发人员工具监控了性能。我注意到听众不断增加,堆也是如此。JavaScript听众不断增加

enter image description here

的一部分,其中的听众都在增加看起来是这样的

let ival = $interval(function() { 
    $http.get('someurl') // this call is actually done through a service, don't know if that matters 
}, 1000) 

我会明白,如果堆增长,因为没有与否有关垃圾收集器收集了一些数据,但我不知道理解听众为什么越来越多?

这是一个可再现,最小的例子:

index.html文件:

<!doctype html> 
<html ng-app="exampleModule"> 
    <head> 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.6/angular.min.js"></script> 
    <script src="script.js"></script> 
    </head> 
    <body> 
    <div ng-controller="someController"> 
    </div> 
    </body> 
</html> 

而且的script.js文件:

结果,当你观看演出与上图相同。你应该使用一个简单的网络服务器来发出GET请求。

+0

你是否调用'$ interval.cancel(ival);'某处,或者以某种方式停止该间隔?或者是一个又一个新的间隔而不是停止旧的间隔? –

+0

$ interval.cancel(ival)将在活动被销毁后被调用。间隔是在创建活动时创建的。 – Stefan

+0

当应用程序仅包含您展示的代码片段时,它是否适用于您?如果没有,您需要提供http://stackoverflow.com/help/mcve复制您的问题。它可以是几乎所有的东西。 – estus

回答

4

this issue,更具体this comment,它是由镀铬引起了​​不垃圾的业绩记录期间收集听众时间线。

+0

就是这样。我在录制过程中执行了垃圾收集,堆性能很好。我不明白为什么gc在录制过程中不收集听众。感谢你的回答。 – Stefan

0

您的获取请求可能会持续1秒以上。但你每1秒钟就会调用一次。所以一个请求在另一个请求结束之前就开始了,并且它们堆积起来,最终变慢。

我建议,不要做的请求,如果前一个还没有完成:

let previousOneOngoing = false; 
let ival = $interval(function() { 
    if(previousOneOngoing) return; 
    previousOneOngoing = true; 
    $http.get('someurl') 
     .then(function() { previousOneOngoing = false; }) 
}, 1000) 
+0

请求只持续3ms。我用$ timeout实现它,并在旧的完成时设置一个新的超时。同样的结果。我只是在间隔中使用了一个简单的XMLHttpRequest,并且堆没有增长。所以我认为$ http做的事情不应该是 – Stefan

+0

@Stefan对不起,误会。查看robertklep的答案。 –