【问题标题】:Flutter: memory leak with isolate (compute)Flutter:带有隔离(计算)的内存泄漏
【发布时间】:2021-01-22 11:29:21
【问题描述】:

我每次在 Flutter 应用程序中调用 compute() 时都会看到内存泄漏,据我所知,这基本上只是一种产生隔离的便捷方式。我的应用程序内存占用量在 GC 之后增长并且从未下降。 我已将我的代码缩减为只调用一个空函数 - 问题仍然可以重现:

  // run my _encodeJpeg in isolate
  await compute(_encodeJpeg, null);


  Future<void> _encodeJpeg(_JpegEncodeParams params) async {
    // I've made this function empty just to see if the memory leak is still reproducible - yes it is!
  }

请注意,如果我不调用 compute() - 我的应用程序中没有内存泄漏。所以肯定是 compute() 导致了这个问题。

然后我创建了一个新的 Flutter 入门应用程序(默认带有按钮和计数器) - 并以相同的方式从该应用程序调用 compute(),它工作正常!没有内存泄漏。很奇怪吧?!

我的应用程序中存在导致compute() 内存泄漏的问题,而应用程序本身(如果我不调用compute)没有任何内存泄漏。我使用一些以前版本的 Flutter 创建了我的应用程序,但现在我使用最新的 Flutter 编译它(见下文)。

我的应用中是否有某些内容需要手动更新以使 compute() 按预期工作?

更新:我在使用 Computer (https://pub.dev/packages/computer) 等库时没有看到此问题:

final computer = Computer();
await computer.turnOn(workersCount: 1);
await computer.compute<void, _JpegEncodeParams>(_encodeTempJpeg, param: ...);
computer.turnOff();

扑扑医生:

[√] Flutter (Channel stable, 1.22.5, on Microsoft Windows [Version 10.0.18363.1256], locale en-US)
• Flutter version 1.22.5 at C:\sdk\flutter
• Framework revision 7891006 (6 weeks ago), 2020-12-10 11:54:40 -0800
• Engine revision ae90085a84
• Dart version 2.10.4

【问题讨论】:

    标签: flutter memory-leaks dart-isolates


    【解决方案1】:

    我在颤振 2.2.3 上看到同样的问题

    我作为参数传递给计算的所有 data 都保存在内存中 - await compute(exampleGlobalFunction, data)

    我在Flutter DevTools / Memory 选项卡中检查了它,数据的实例永远不会被释放。如果我直接调用函数(不计算),那么数据会被正确释放。

    编辑:我想我找到了解决方案 - 创建了一个 github 问题 https://github.com/flutter/flutter/issues/86470

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-12
      • 2020-02-06
      • 1970-01-01
      • 2014-08-16
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      • 2017-09-13
      相关资源
      最近更新 更多