2013-02-11 26 views
4

我有我的angular.js應用程序中似乎是內存泄漏。基本上,該頁面由一個信息表組成,該信息表每五秒從AJAX調用的JSON編碼結果更新。我創建了一個簡單的jsfiddle版本在這裏:http://jsfiddle.net/alalonde/TtGXW/6/Angular.js內存泄漏與ngRepeat上查詢數據

控制器:

function HostController($scope, $timeout, Data) { 
    $scope.encoders = Data.load(); 
    $scope.refreshInterval = 5; 

    $scope.reload = function() { 
    $scope.encoders = Data.load(); 
    }; 

    $timeout(function doReload() { 
    $scope.reload(); 
    $timeout(doReload, $scope.refreshInterval * 1000); 
    }, 5000); 
} 

模板的一個片段:

<table class="table table-striped table-bordered" ng-controller="HostController"> 
    <tr> 
    <th>Status</th> 
    <th>... 
    </tr> 
    <tr ng-repeat="enc in encoders"> 
    <td> 
     <div>{{ enc.name }}</div> 
     <div ng-show="enc.version"> 
     v{{ enc.version.major }}.{{ enc.version.minor }}-{{ enc.version.rev }} 
     <span ng-show="enc.version.user">- {{ enc.version.user }}</span> 
     </div> 
    </td> 
    </tr> 
</table> 

當考慮在Chrome每分鐘左右堆快照,內存使用量每次都會略有增加。我已經將Igor Minar的修復應用到了我的本地angular.js(https://github.com/angular/angular.js/commit/bd524fc4e5fc0feffe85632a7a6560da6bd9b762),這對我有所幫助,但內存使用情況仍然無情地蔓延。

任何有關使用Chrome內存分析器與angular.js的提示將不勝感激。

+0

我無法在jsfiddle中重現mem泄漏。我離開了應用程序運行了一段時間,我看到的只是通常的GC模式,一旦有足夠的垃圾積累,釋放內存。 jsfiddle實際上是否泄漏到您的機器上?你能提供瀏覽器版本信息嗎? – 2013-02-18 08:04:46

+0

如果問題確實是可重現的,請在https://github.com/angular/angular.js/issues上提供錯誤。 – 2013-02-18 18:43:24

+0

這裏是我的Chrome內存分析器的屏幕截圖(http://files.boxelderweb.com/angular-chrome-memory-profiler.png)。我將refreshInterval更改爲1秒以加快速度。 15分鐘左右增加0.47MB。展開(數組)列表,似乎所有HTML元素下面,包括泄漏。 @IgorMinar你能驗證嗎?如果是這樣我會提交一個錯誤。 – alalonde 2013-02-19 21:09:27

回答

4

當我輪詢數據並使用ng-repeat遍歷它並呈現行時,我遇到了與內存消耗相同的問題。

當我使用「item in items」時,我得到的內存使用量不斷增加,但是當我使用「items in item track by $ index」時,內存使用情況穩定並且GC正確清理。

+1

我有一個內存泄漏問題,併爲我修復(使用angular v1.1.5),所以謝謝!你是否能夠找到任何進一步的信息,爲什麼這會修復內存泄漏? – brodie 2014-02-25 12:37:21

+0

在AngularJs 1.6.4「track by $ index」中遇到了同樣的問題,修復了內存泄漏,但是我不能使用「by index | filter:myfilter」(例如過濾器),所以我設置了一個計時器, 30分鐘。 – AKMorris 2017-11-09 23:57:10