在将一堆下载的JSON反序列化为对象时,我试图在移动应用程序中使用计算实例来减少麻烦。
当我使用实施反序列化方法计算,堆一直都在通过JSON 和返回的反序列化对象(在列表中)无限期。即使该方法已关闭并且父/调用对象已退出,GC仍会正常触发但不会从堆中删除对象。这样,在使用DevTools内存探查器时,它会显示失控的内存消耗-堆只会不断增大。
正常内存配置文件-直接调用反序列化方法时,内存使用量徘徊在45MB左右(但会在应用程序中造成垃圾)
失控的内存配置文件-通过计算调用反序列化方法时,内存使用量呈线性增加,并且从不停止使用(但不会在应用程序中造成混乱)
static Stream<EventCommitInfoModel> getEventsAfterDate(DateTime date) async* {
// variable defs for scope reuse
while (count < maxCount && retryCount > 0) {
try {
json = await http.read(url);
// currentEvents = await compute(EventModel.fromJsonArray, json);
currentEvents = EventModel.fromJsonArray(json);
db = await AppStateModel.database;
await db.upsertEventModels(currentEvents);
yield new InfoModel(maxCount, currentEvents.length);
}
catch (ex) {
// try again or close
}
}
print("stream is closing.");
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,相关行以“ currentEvents =”开头。正常的内存行为可以通过以下方式看到:
currentEvents = …Run Code Online (Sandbox Code Playgroud)