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

Leo*_* Nx 1 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

Leo*_* Nx 17

显然这是我自己的一个愚蠢的错误......我做了一些更新功能,StreamStream. 所以有一个无限循环添加和响应Stream.

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


Doc*_*Doc 6

这意味着您的应用程序正在使用内存,并且正在由 GC(垃圾收集器)释放。如果内存要求不是太高,您不会看到 GC 花费大量时间来释放内存,但如果它使用了太多内存内存,那么你的应用程序就会滞后。如果性能受到影响,那么您需要修复它。如果可以的话,在真机上测试一下。


Mar*_*cel 6

这不是错误,它只是一条Android日志消息,通知您有关垃圾收集发生的时间。 一切正常。日志消息不会损害您的应用程序,有关本机Android上的同一主题,请参见此问题。如果内存不足,或者由于垃圾回收而导致性能下降,这只是一个问题。ew


话虽这么说,让我们看看如何减少这些消息的产生。

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

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

  • 另外,不要通过将小部件存储在这样的状态来“缓存”自己

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

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

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


liv*_*ove 5

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

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


归档时间:

查看次数:

2786 次

最近记录:

7 年,4 月 前