dart - 由于File.openRead和流处理而导致的内存泄漏?

标签 dart dart-io dart-async

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

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处理之前。

最佳答案

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

如果您减少持续时间(例如2毫秒),则会看到内存使用量增加,直到达到一定程度(我的计算机上为500MB,但里程可能会有所不同)。显然,此时垃圾回收器将运行并释放未使用的内存,从而将内存使用率降低到几乎为零。然后它再次上升,等等。

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

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

关于dart - 由于File.openRead和流处理而导致的内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17360916/

相关文章:

flutter - BLoC产生新状态后未更新BlocBuilder()

dart - 分析器无法在Visual Studio Code中工作……还是吗?

dart - 如何将数据从事件监听器内部添加到同步广播 StreamController 到该 Controller 的 Stream?

Dart 限制同时连接

android - Flutter Fresh 项目总是在所有 Flutter Channel 中出错

flutter - 在 Dart 编程 flutter 中将两个列表转换为字典

dart - 在 Dart 中读取数据文件进行单元测试

dart - 如何使用 Dart 和路由包将过滤器应用于每个请求?

ssl - Dart 的 bindSecure 函数如何找到 SSL 证书?

dart - 我怎么知道两个流何时完成?