简述Flutter Dart垃圾回收机制

为了更直接的理解Flutter中的垃圾回收机制,本文精准可达的介绍核心要点。

策略:

Dart垃圾回收的策略可以简单概括为:"分代"GC。

概述

Dart的垃圾回收分代为:"新生代","老生代"。

Dart还专门设计了调度器(在引擎中hooks的),当检测到空闲且没有用户交互时进行GC操作

详细

Dart内存回收效率高的其他原因:

新生代:

1.Dart对象分配用的是bump指针方式,相对于malloc效率要高得多

2.新对象被分配到连续、可用的内存空间,这个区域包含两个部分:活跃区和非活跃区,新对象在创建时被分配到活跃区、一旦填充完毕,仍然活跃的对象会被移动到非活跃区,不再活跃的对象会被清理掉,然后非活跃区变成活跃区,活跃区变成非活跃区,以此循环。

确定Object是存活还是死亡,GC从根对象开始检测,将有引用的Object(存活的)移动到非活动状态,直到所有存活的Object都被移动,死亡的Object就被留下,此方式采用了Cheney算法

注意:新生代阶段主要是清理一些寿命很短的对象,比如StatelessWidget。当它处于阻塞时,它的清理速度远快于老生代的mark、sweep方式。并且结合调度,所以性能影响非常低。

老生代

在新生代阶段未被回收的对象,将会由老生代收集器管理新的内存空间:mark-sweep。
在老生代收集器的管理分为两个阶段:
阶段1:遍历对象图,然后标记在使用的对象
阶段2:扫描整个内存,并且回收所有未标记的对象

注意:标记和回收都会阻塞,但是由于短暂的对象在新生代阶段已经被处理,并且配合调度器,所以性能影响非常低。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文引用自这里这篇文章的所有内容均来自 朴灵的《深入浅出Node.js》及A tour of V8:Garbage...
    楠小忎阅读 1,461评论 0 2
  • 内存区域划分,从高地址到低地址依次是 栈区:内存由系统控制开辟、释放。当系统的栈区大小不够分配时, 系统会提示栈溢...
    梵生阅读 650评论 0 0
  • 1.介绍 Flutter主要使用Dart开发语言,在调试和发布两个版本中,Dart RunTime是始终存在,但两...
    rhyme_lph阅读 5,076评论 1 1
  • 在不断学习的过程中将学习到的知识整理成一个个知识模块,尽量保持其完整性与形成知识网络是编写这些文字的初衷。PS这是...
    littleSatr阅读 466评论 0 1
  • 引用计数 引用计数(Reference Counting)算法是每个对象计算指向它的指针的数量,当有一个指针指向自...
    造车坊阅读 421评论 0 0