简述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:扫描整个内存,并且回收所有未标记的对象

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

你可能感兴趣的:(简述Flutter Dart垃圾回收机制)