Flutter之Dart语言特点

一、JIT与AOT

Dart是少数同时支持JIT(即时编译)和AOT(运行期编译)的语言之一,这使Dart具有运行速度快、执行性能好的特点

JIT:即运行时即时编译,在开发周期中使用,可以动态下发和执行代码,开发测试效率高,但运行速度和执行性能则会因为运行时即时编译受影响(代表语言JS、Python)

AOT:即提前编译,可以支持生成被直接执行的二进制代码,运行速度快、执行性能表现好,但每次执行前都需要提前编译,开发测试效率底(代表语言C、C++)

二、内存分配与垃圾回收

  • 内存分配策略

Dart VM的内存分配策略为创建对象时只需在堆上移动指针,内存增长始终线性,省掉了查找可用内存的过程

Dart中使用Isolate实现并发。Isolate类似于线程但不共享内存,是一个独立运行的worker。这样使得Dart的isolates拥有自己的私有堆,每个isolate的垃圾回收事件不影响其他isolates的性能,所以isolates可以便面UI出现卡顿以及很好的进行频繁的回收操作

  • 垃圾回收机制

Dart的垃圾回收机制采用了分代垃圾回收策略,新生代在回收内存时采用“半空间”机制,触发垃圾回收时,Dart会将当前半空间中的“活跃”对象拷贝到备用空间,然后整体释放当前空间内所有内存。回收过程中,Dart只需操作少量的“活跃”对象,没有引用的的大量“死亡”对象则被忽略,这样的回收机制很适合Flutter框架中大量Widget销毁重建的场景。

Dart的垃圾回收分代为“新生代”和“老生代”。


图片1.png

Dart还专门设计了调度器(在引擎中hook),当检测到空闲并没有用户交互时进行垃圾回收操作
调度图解.png

新生代:

  1. Dart对象分配用的是bump指针方式(在内存比较规整的情况下,虚拟机会找到当前内存分配的指针,然后在紧接着的一块内存中为这个对象分配相应的区域),相对于malloc(申请一段适当大小的内存空间,在程序运行过程中,堆内存从低地址向高低之连续分配,随着内存释放,会出现不连续的空闲区域)效率要高得多

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


    循环图解.png

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

    cheney图解.png

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

老生代:

在新生代阶段未被回收的对象,将会由老生代收集器管理新的内存空间:mark-sweep。

在老生代收集器的管理分为两个阶段:

  1. 遍历对象图,然后标记在使用的对象
  2. 扫描整个内存,并且回收所有未标记的对象

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

调度器:

在Flutter引擎中,为了最小化垃圾收集对应用程序和UI性能的影响,与垃圾回收提供了hook,当引擎监测到应用程序处于空闲状态(无用户交互),会发出信号,为垃圾回收提供运行其回收阶段而不影响性能的机会。并且垃圾回收器可以在这些空闲时间进行内存压缩,从而减少内存碎片来优化内存。

三、无需单独的声明式布局语言

Flutter可以通过Dart编译定义,并不需要类似JSX或XML的声明式布局语言,易于阅读和可视化,开发中更不需要可视化界面构建,因为热重载可以让我们在手机上立即看到效果。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,099评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,828评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,540评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,848评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,971评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,132评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,193评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,934评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,376评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,687评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,846评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,537评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,175评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,887评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,134评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,674评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,741评论 2 351

推荐阅读更多精彩内容