【问题标题】:Memoryleak due to File.openRead and Streamhandling?File.openRead 和流处理导致内存泄漏?
【发布时间】:2013-06-28 08:58:14
【问题描述】:

我陷入了内存泄漏。我写了以下示例,它不断增加内存使用量:

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(),而是想在 Stream 处理之前添加 Future 处理。

【问题讨论】:

标签: dart dart-io dart-async


【解决方案1】:

没有内存泄漏。垃圾收集器只是不运行,这是一个区别。

如果您减少持续时间(例如 2 毫秒),您会看到内存使用量上升,直到达到某个点(在我的机器上为 500MB,但您的里程可能会有所不同)。显然,此时垃圾收集器运行并释放未使用的内存,将内存使用量减少到几乎为零。然后它再次上升等等等等。

至于为什么垃圾收集器不运行,我真的不知道。似乎没有规范或文档说明 GC 是如何工作的。

至少,您的记忆不会丢失,并且会在需要时被回收。所以 - 你的代码很好。

【讨论】:

  • 这就是我的想法
猜你喜欢
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
  • 1970-01-01
  • 1970-01-01
  • 2015-07-06
  • 2014-06-07
  • 2013-11-20
相关资源
最近更新 更多