我有一个网络应用程序,它有一个计时器,每 3 秒触发一次轮询以获取数据。它工作正常大约 2.5 分钟,然后 Chromium 崩溃了。
我的请求 Dart 看起来像这样
HttpRequest.getString('data/get_load_history_recent.json')
.then((e) => _recentHistoryResponse(e))
.catchError((e) => _recentHistoryError(e));
您能想到会发生这种情况的任何原因吗?我认为这是内存泄漏...
Edit:这是我的_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
.
Edit 2 :好的,所以我发现了Map obj = JSON.decode(data);
导致崩溃。我在 Javascript 论坛上读到超时会导致内存无法释放(我从来没有想过这一点,但这是有道理的),这是真的吗?有人能想出一种更好的方法来做到这一点吗?可以直接调用垃圾回收吗?我已经没有主意了。
还有一个问题here https://stackoverflow.com/questions/17393761/memory-leak-till-crash-due-to-httprequest,提示 HttpRequest 内存泄漏;但是我无法在 Dart 问题跟踪器中找到任何内容。如果您认为这可能是真正的内存泄漏,那么可能值得提出错误 https://code.google.com/p/dart/issues/entry.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)