2016-04-28 34 views
0

我的主應用程序有一個問題,在沒有刷新的情況下使用應用程序,內存(和CPU使用率)越來越高。AngularJS簡單的應用程序內存泄漏

我設法複製它: 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); 
}); 

SHIFT +在Chrome ESC

現在按「問題」,您的該選項卡的內存將爲1GB + - 。

按「默認」,看到內存仍然是1GB。

按「問題」,看到內存正在下降,然後再次上升。

按「默認」一次,然後按「問題」 10次點擊快捷方式spamy,看看你的記憶扣球以1.5-2GB

我有大約30個模塊在我的系統如果這種事情發生在所有人身上,我明白爲什麼記憶只是在膨脹。

這是怎麼發生的?

如何解決?

*我知道我應該使用this而不是$scope,但我想重現真實的代碼。

+0

我不確定爲什麼要在數組中放入10000000個項目(並且每個clilck添加相同的數量)。這似乎是一個非常不尋常的用例。我會認爲這不是angulars故障,因爲當你使用vanilla Javascript時會發生同樣的情況。 – DrColossos

+0

我同意@DrColossos爲什麼要循環10000000次。問題在於這一部分。 JavaScript是客戶端,不要讓你的客戶有困難。 :D – ariezona

+0

這是否會改變你的任何事情:https://jsfiddle.net/fmgy778r/1/? – Fidel90

回答

1

我想我現在明白你想要什麼。我用你提供的和更新的版本測試它(1.4.8可用於小提琴)。

在沒有修改的情況下,我的Chrome(64位,Linux,8GB)使用最初的120MB,點擊「問題」後,它會超過1 GB並停留在那裏。

但是,如果你添加

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

到您的第一個控制器,內存會落回原位。請注意,這不是直接的,而是在垃圾收集器的下一次運行之後(在我的機器上,這發生在約5-15秒之後)。 GC運行後,內存將回到初始值。有許多「問題」點擊的事件,由於「$ destroy」事件被觸發並且變量被重置並準備好用於GC,所以內存保持不變。

+0

你知道爲什麼angular不會「釋放/刪除/取消設置「所有的變種都會毀滅,我需要手動去做?當只有一個變量佔用大部分內存時,我沒有這種情況。 – Amit

+0

我真的不知道爲什麼會出現這種情況,但我認爲這是一個JS問題而不是角度問題。也許角度確實會破壞它的範圍變量,但是GC需要更多時間來完成它的事情,而這種說法是錯誤的。也許有更深層次經驗的人可以回答這個問題。就我個人而言,我總是喜歡這樣的事情,即使在更小的控制器,指令,....除此之外,最好的做法是實施這樣的生命週期方法來完成所有的清理工作。 – DrColossos