AngularJS简单的app内存泄漏

时间:2016-04-28 09:18:10

标签: angularjs memory-leaks

我的主应用程序出现问题,在没有刷新的情况下使用应用程序,内存(和CPU使用率)越来越高。

我设法重现了它: https://jsfiddle.net/fmgy778r/

angular.module('TestModule', []).controller('TestController', function ($controller, $scope) {
    $scope.a = [];
    for (var i = 0; i < 10 * 1000 * 1000; i++)
        $scope.a.push("stringstring" + i);
});

在Chrome上按 shift + ESC

现在按&#34; 问题&#34;,该标签的内存为1GB + - 。

按&#34; 默认&#34;并看到内存仍然是1GB。

按&#34; 问题&#34;并看到内存正在下降然后再次上升。

按&#34; 默认&#34;一次,然后按&#34; 问题&#34;以快速点击垃圾邮件的方式进行10次,看到你的内存达到1.5-2GB

我的系统中有大约30个模块,如果发生这种情况,我会明白为什么内存只是膨胀。

为什么会这样?

如何解决?

*我知道我应该使用this而不是$scope,但我想重现真实的代码。

1 个答案:

答案 0 :(得分:1)

我想我现在明白你想要什么。我用你提供的和更新版本测试了它(1.4.8可用于小提琴)。

如果不进行修改,我的Chrome(64位,Linux,8GB)使用初始120MB,点击&#34;问题&#34;后,它会超过1 GB并停留在那里。

但是如果你添加

$scope.$on('$destroy', function() {
   $scope.a = [];
});

进入你的第一个控制器,内存将恢复原状。请注意,这不是立竿见影的,但是在下一次运行垃圾收集器之后(在我的机器上,这发生在大约5 - 15秒之后)。 GC运行后,内存恢复到初始值。有很多&#34;问题的事件&#34;点击,记忆保持不变,因为&#34; $ destroy&#34;触发事件并重置变量并为GC做好准备。