在我的AngularJS 1.5应用程序中,我发现了一种非常奇怪的记忆行为。
我设置了一个非常简单的测试: 一个几乎为空的模板是状态1(使用Angular ui-router),它只转发到状态2。 状态2的模板由作用域内的数组填充了一个相当大的虚拟表。 在控制器中:
$scope.foodahoo = [];
for(var i = 0; i < 300; i++) {
var obj = {};
for(var j = 0; j < 50; j++) {
obj['prop' + j] = 'value' + j;
}
$scope.foodahoo.push(obj);
}
在模板中:
<table>
<tr ng-repeat="myobj in foodahoo">
<td ng-repeat="(key, value) in myobj">{{key}}: {{value}}</td>
</tr>
</table>
预期的内存行为:在状态1,堆开始时为低电平,当我进入状态2时上升,在返回到状态1时下降到相同的低电平等等 - 无论我多久重复一次周期。
然而,实际行为是这样的(记录在Chrome开发工具中):
标记为红色表示从状态1到状态2的状态变化。 看起来在开始时只需添加内存而不会在其间收集垃圾。然而,然后,每三个周期,正好在加载状态的中间,Chrome认为:&#34;哎呀,我消耗了太多的内存,让我们释放一些垃圾。&#34; 然而,即便如此,堆也没有达到它在起始点(状态1)的水平。
用$scope
和this
替换controller as ...
无效:结果相同。然而,使用纯HTML显示正常行为。
所以,我的问题是:
这只是一个Chrome怪癖吗?或正常的浏览器行为?或者我的$scope
实际上是否存在常规内存问题?如果是:我如何进一步调查?堆配置文件比较还没有给我任何见解。