【问题标题】:Does ng-include have memory-leak?ng-include 是否有内存泄漏?
【发布时间】:2013-03-09 11:45:53
【问题描述】:

我使用ng-include来切换不同的数据页面,这会做大量的数据渲染。

我发现浏览器的内存使用量一直在增长,而且永远不会回落。

代码

代码很简单。

HTML 代码:

<body ng-controller="MainCtrl">
  <div>
    <button ng-click="url='nodata.html'">No data</button>
    <button ng-repeat="i in getNumArray(10)" ng-click="loadData(i)">Load data {{i}}</button>
  </div>
  <hr/>
  [{{url}}]
  <div ng-include="url"></div>
</body>

它将显示一个“无数据”按钮,以及用于加载不同页面的 10 个数据按钮。

角码:

app.controller('MainCtrl', function($scope) {
  $scope.url = "nodata.html";
  $scope.loadData = function(n) {
    $scope.url = "data" + n + ".html";
  }

  $scope.getNumArray = function(n) {
    var arr = [];
    for(var i =0;i<n;i++) {
      arr.push(i);
    }
    return arr;
  }
});

app.controller('DataCtrl', function($scope, $http){
  $http.get('data.json').success(function(data){
      $scope.data = data;
  })
});

还有“dataN.html”页面:

<div ng-controller="DataCtrl">
  <table ng-repeat="x in getNumArray(500)">
    <tbody>
      <tr>
        <td>{{data["key0"]}}</td>
        <td>{{data["key1"]}}</td>
        <td>{{data["key2"]}}</td>
        <td>{{data["key3"]}}</td>
        <td>{{data["key4"]}}</td>
        <td>{{data["key5"]}}</td>
        <td>{{data["key6"]}}</td>
        <td>{{data["key7"]}}</td>
        <td>{{data["key8"]}}</td>
        <td>{{data["key9"]}}</td>
      </tr>
    </tbody>
  </table>
</div>

“nodata.html”页面:

<div>No data yet.</div>

还有“data.json”:

{
  "key0": "sdf sdf sdf sdf sdf sdf sdf sdf sdf sd fds fds fsd fds fds fds fds fsd fds fds f",
  "key1": "sdf sdf sdf sdf sdf sdf sdf sdf sdf sd fds fds fsd fds fds fds fds fsd fds fds f",
  "key2": "sdf sdf sdf sdf sdf sdf sdf sdf sdf sd fds fds fsd fds fds fds fds fsd fds fds f",
  "key3": "sdf sdf sdf sdf sdf sdf sdf sdf sdf sd fds fds fsd fds fds fds fds fsd fds fds f",
  "key4": "sdf sdf sdf sdf sdf sdf sdf sdf sdf sd fds fds fsd fds fds fds fds fsd fds fds f",
  "key5": "sdf sdf sdf sdf sdf sdf sdf sdf sdf sd fds fds fsd fds fds fds fds fsd fds fds f",
  "key6": "sdf sdf sdf sdf sdf sdf sdf sdf sdf sd fds fds fsd fds fds fds fds fsd fds fds f",
  "key7": "sdf sdf sdf sdf sdf sdf sdf sdf sdf sd fds fds fsd fds fds fds fds fsd fds fds f",
  "key8": "sdf sdf sdf sdf sdf sdf sdf sdf sdf sd fds fds fsd fds fds fds fds fsd fds fds f",
  "key9": "sdf sdf sdf sdf sdf sdf sdf sdf sdf sd fds fds fsd fds fds fds fds fsd fds fds f"
}

这是一个现场演示:

http://plnkr.co/edit/KGZVXIBws1kthgN2bxEJ?p=preview

当我用chrome打开live demo时,初始化内存使用量小于100M。然后我点击“加载数据”按钮,它很快就会增长到300M并且永远不会回退,即使我点击“无数据”按钮加载“nodata.html”。

正常吗? ng-include 有内存泄漏还是我遗漏了什么?还是内存使用没问题我不用担心?

截屏

我创建了一个截屏视频来展示它:

【问题讨论】:

  • 你在使用 chrome 扩展 Angular Batarang 吗?它倾向于使具有大数据的角度应用程序表现得非常缓慢。也尝试在它自己的窗口上运行它。 Plnkr.co 的记忆力不是很好
  • 我安装了Angular Batarang,但没有启用它。我也尝试过使用干净的 chrome 和 firefox,两者都有同样的问题。我使用 plnkr.co 方便地演示这个问题,您可以下载源代码在您自己的计算机上进行测试。

标签: memory-leaks angularjs


【解决方案1】:

尝试升级到 1.0.5 版。它似乎没有这个问题。 我相信这是因为 1.0.3/4 在模板中有顶级空白节点时存在内存泄漏。

【讨论】:

  • 即使我使用 1.0.5 仍然有同样的问题。刚刚在chrome中试了一下,内存很快就增长到300M
  • 不在我的机器上。你还在 Pnkr 中跑步吗?
  • 尝试单独运行。
  • 我刚试过,在分离的chrome中也有同样的问题(版本:26.0.1410.5)
  • 我在 Windows 上使用 Chrome 时遇到了同样的问题。您找到解决问题的方法了吗?
【解决方案2】:

Stackoverflow 不是提交错误的地方。请在https://github.com/angular/angular.js/issues 提交问题并继续讨论。

我已将用例简化为单个文件:http://plnkr.co/edit/Wm4YRsLGJUDqUcww2DQZ?p=preview

这是我发现的。

  1. 仅在 Windows 上泄漏,在 Mac OS X 上不泄漏
  2. 仅在 plunker 中泄漏。当我在 plunker 外运行它时,它工作正常。

你能在 plunker 之外重现这个问题吗?

【讨论】:

  • 您可以通过以下方式在 plunker 之外运行应用程序:run.plnkr.co/3SWA4CzwnyKQyGXm
  • 该应用不会在 plunker 之外泄漏(使用上面的链接)和 Windows 上的 Chrome Canary(版本 27.0.1436.1 canary)
  • 即使我在单独的 plunker 中运行它也会泄露(chrome 版本:26.0.1410.5)
猜你喜欢
  • 1970-01-01
  • 2012-09-13
  • 2020-07-22
  • 2010-10-13
  • 2019-01-28
  • 2015-02-07
  • 2011-01-29
  • 2011-05-08
  • 1970-01-01
相关资源
最近更新 更多