我陷入了内存泄漏。我写了以下示例,它不断增加内存使用量:
import 'dart:io';
import 'dart:async';
import 'dart:utf';
Future<Stream<List<int>>> readFile2Stream(String path){
File f = new File(path);
return f.exists().then((bool exists){
if( !exists ){
return new Stream<List<int>>.fromIterable([encodeUtf8("Could not find $path")]);
}else{
return f.openRead();
}
});
}
void readFile(String path){
readFile2Stream(path).then(
(Stream<List<int>> data){
data.listen((List<int> data){
print(data);
},
onError: (dynamic error){
print("Error: $error");
},
onDone: (){
print("Done");
});
}
);
}
void main() {
Timer t = new Timer.periodic(new Duration(seconds:2),(Timer it){
readFile("memleaktest.dart");
});
}
有人可能因为某些原因给我一个暗示吗?我没有任何线索: - (
一些小问题:
有没有办法通过删除返回类型的Future封装来简化此示例? 我不想使用File.existsSync(),而是我想要将Future处理添加到Stream处理。
答案 0 :(得分:2)
没有内存泄漏。垃圾收集器不运行,这是一个区别。
如果你减少你的持续时间(例如2毫秒),你会看到你的内存使用量上升,直到它达到某个点(我的机器上500MB,但你的里程可能会有所不同)。显然,此时垃圾收集器运行并释放未使用的内存,将内存使用量减少到几乎为零。然后再次上升等等。
至于为什么垃圾收集器没有运行,我真的不知道。 GC似乎没有规范或文档如何工作。
至少,如果需要,您的记忆不会丢失并将被回收。所以 - 你的代码很好。