我有一个 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 论坛上阅读超时导致内存无法释放(我从未想过,但这是有道理的),这是真的吗?谁能想到更好的方法来做到这一点?可以直接调用垃圾回收吗?我的想法不多了。