Flutter Log获得后台并发复制GC释放的消息

时间:2019-01-09 19:49:08

标签: dart flutter

在我的Flutter日志中,我不断收到此消息(只是带有一些不同的数字):

Background concurrent copying GC freed 153040(3MB) AllocSpace objects, 12(4MB) LOS objects, 49% free, 4MB/8MB, paused 819us total 173.633ms

我最近实现了bloc模式,我对流不那么熟悉,也许我在这里做错了事...

我有大约5000行代码,所以我不能将其全部发布在这里,只是想知道您是否知道这个问题,也许这是一个常见错误

编辑:哦,是的,顺便说一句,我正在Android模拟器Android Pie上进行测试。我的平台是Windows。

6 个答案:

答案 0 :(得分:2)

很明显,这是我自己一个愚蠢的错误……我做了一些更新功能,在Stream上添加了一些内容,然后立即又被调用,因为它也在监听Stream。因此,存在Stream添加和反应的无限循环。

感谢任何人的帮助,这里有一些有用的提示!

答案 1 :(得分:1)

这不是错误,只是一条Android日志消息,通知您何时进行垃圾收集。 一切正常。 日志消息不会损害您的应用程序,请参阅this question regarding the same topic on native Android。 如果内存不足,或者由于垃圾回收而导致性能下降,这只是一个问题。 ew。


话虽这么说,让我们看看如何减少收到这些消息。

  • 通常,仿真器的资源有限。 因此,最简单的方法是增加模拟器的RAM大小或使用实际的电话代替模拟器。

  • 其次,请确保您的逻辑不会处理大量数据,或者如果可以,请尽快处理。

  • 此外,不要将自己的小部件存储在这样的状态下

    class _MyWidgetState extends State<MyWidget> {
      Widget button;
    
      @override
      void initState() {
        super.initState();
        button = RaisedButton(...);
      }
    
      @override
      Widget build() => button;
    }
    

    要获取有关为什么不这样做的更多信息,请查看my answer to a somewhat related question。 基本上,Dart使用两种类型的垃圾收集器, Young Space Scavenger 用于短期对象,而 Mark Sweep GC 用于长期对象。 通过手动缓存小部件,您将依赖后者,因为后者速度较慢,可能实际上会通知Android有关释放的内存,从而导致您的日志。

  • 最后,您始终可以过滤或忽略日志。 :D

答案 2 :(得分:0)

这意味着您的应用正在使用内存,并且已被GC(垃圾收集器)释放。如果内存要求不是很高,您不会看到GC花费大量时间来释放内存,但是使用太多内存,则您的应用程序将滞后。如果性能受到影响,则需要对其进行修复。如果可以的话,请在真实的手机上进行测试。

答案 3 :(得分:0)

这应该是正常的,直到您的消息显示“ 0%可用”之类的值,并且GC释放的数量很少。这意味着您的内存不足,需要重新设计代码。

Background concurrent copying GC freed 3(64B) AllocSpace objects, 0(0B) LOS objects, 0% free, 191MB/192MB, paused 217us total 1.338s

答案 4 :(得分:0)

这并不意味着碰到这个问题/答案,但是,以防今天对其他人有用...出现此消息的另一个原因是,当应用程序的逻辑进入无限循环时(例如,游标永远不会移至下一个记录,等等)。最终,GC在这种情况下开始进行过多的工作。

答案 5 :(得分:0)

旧问题和一些好的答案,但就我而言,我忘记在数据库查询中包含 cursor.moveToNext(),-所以我在创建时运行了一个无限循环无限数量的对象 - 以防万一它对任何人有用。