4

我有一个 Web 应用程序,它有一个计时器,它每 3 秒触发一次民意调查以获取数据。它可以正常工作约 2.5 分钟,然后 Chromium 崩溃。

我的请求 Dart 看起来像这样

HttpRequest.getString('data/get_load_history_recent.json')
  .then((e) => _recentHistoryResponse(e))
  .catchError((e) => _recentHistoryError(e));

你能想到会发生这种情况的任何原因吗?估计是内存泄露...

编辑: 这是我的_recentHistoryResponse()

void _recentHistoryResponse(String data)
{
  Map obj = JSON.decode(data);
  if(obj['status'] == 'success')
  {
    List processes = obj['data']['processes'];
    List newItems = new List();

    List oldIdsArray = new List();

    int length = appDataDic.load_history_list.length;
    for(HistoryDataVO oldVO in appDataDic.load_history_list)
    {
      oldIdsArray.add(oldVO.loadID);
    }

    for(Map process in processes)
    {
      HistoryDataVO dataVO = new HistoryDataVO(); 
      dataVO.loadID = process['loadID'];
      dataVO.time = process['time'];
      dataVO.loadType = process['loadType'];
      dataVO.fileName = process['fileName'];
      dataVO.label = process['label'];
      dataVO.description = process['description'];
      dataVO.count = process['count'];
      dataVO.progress = process['progress'];
      dataVO.loadTask = process['loadTask'];

      // Check if the item is currently in the list
      if(length >= 1)
      {
        if(!LoadHistoryHelper.exists(oldIdsArray, dataVO.loadID))
        {
          dataVO.isNew = true;
        }
      }

      newItems.add(dataVO);
    }

    appDataDic.load_history_list.clear();
    appDataDic.load_history_list.addAll(newItems);

  }
}

我已经注释掉了存在检查!LoadHistoryHelper.exists(oldIdsArray, dataVO.loadID))(因为这似乎是显而易见的地方),但虚拟机仍然崩溃。

此外,我采用了相同的代码并将其放入一个独立的应用程序中,轮询检查中唯一真正的区别appDataDic.load_history_list是只是一个@observable List,而不是一个ObservableList.

编辑2: 好的,所以我发现Map obj = JSON.decode(data);导致崩溃。我在 Javascript 论坛上阅读超时导致内存无法释放(我从未想过,但这是有道理的),这是真的吗?谁能想到更好的方法来做到这一点?可以直接调用垃圾回收吗?我的想法不多了。

4

1 回答 1

0

这里还有一个问题,提示HttpRequest存在内存泄漏;但是我在 Dart 问题跟踪器中找不到任何东西。如果您认为这可能是真正的内存泄漏,那么可能值得提出一个错误

于 2014-09-14T15:18:56.013 回答