美文网首页
Dart的特性(JIT 与 AOT、内存分配与垃圾回收、单线程模

Dart的特性(JIT 与 AOT、内存分配与垃圾回收、单线程模

作者: Eyes_cc | 来源:发表于2022-04-23 22:06 被阅读0次

    一、JIT 与 AOT

    借助于先进的工具链和编译器,Dart 是少数同时支持 JIT(Just In Time,即时编译)和 AOT(Ahead of Time,运行前编译)的语言之一。
    JIT 和 AOT 是最常见的 两种编译模式。

    • JIT
      JIT 在运行时即时编译,在开发周期中使用,可以动态下 发和执行代码,开发测试效率高,但运行速度和执行性能 则会因为运行时即时编译受到影响。
    • AOT
      即提前编译,可以生成被直接执行的二进制代码, 运行速度快、执行性能表现好,但每次执行前都需要提前 编译,开发测试效率低。
    • AOT 的典型代表是 C/C++,它们必须在执行前编译成机器 码。
      而 JIT 的代表,则包括了如 JavaScript、Python 等几 乎所有的脚本语言。

    总结来讲,在开发期使用 JIT 编译,可以缩短产品的开发周 期。Flutter 最受欢迎的功能之一热重载,正是基于此特 性。而在发布期使用 AOT,就不需要像 React Native 那样 在跨平台 JavaScript 代码和原生 Android、iOS 代码之间 建立低效的方法调用映射关系。所以说,Dart 具有运行速 度快、执行性能好的特点。

    二、内存分配与垃圾回收

    • Dart VM 的内存分配策略比较简单,创建对象时只需要在 堆上移动指针,内存增长始终是线性的,省去了查找可用内 存的过程。
      Dart 中,并发是通过 Isolate(隔离区) 实现的。Isolate 类似于 线程但不共享内存,是独立运行的 worker。这样的机制,就可以让 Dart 实现无锁的快速内存分配。
    • Dart 的垃圾回收,则是采用了多生代算法。新生代在回收 内存时采用“半空间”机制,触发垃圾回收时,Dart 会将 当前半空间中的“活跃”对象拷贝到备用空间,然后整体释 放当前空间的所有内存。回收过程中,Dart 只需要操作少 量的“活跃”对象,没有引用的大量“死亡”对象则被忽 略,这样的回收机制很适合 Flutter 框架中大量 Widget 销 毁重建的场景。

    三、单线程模型

    Dart 是单线程模型,Dart 中并没有多线程概念,只有 Isolate(隔离区)。 Isolates 之间不会共享内存,通过事件循环(Event Looper)在事件队列 (Event Queue)上传递消息通信。

    • 支持并发线程执行的高级语言(比如,C++、Java、 Objective-C),大都以抢占的方式切换线程,即:每个 线程都会被分配一个固定的时间片来执行,超过了时间片后 线程上下文将被抢占后切换。如果这时正在更新线程间的共 享资源,抢占后就可能导致数据不同步的问题。
      解决这一问题的典型方法是,使用锁来保护共享资源,但锁本身又可能会带来性能损耗,甚至出现死锁等更严重的问题。
    • 这时,Dart 是单线程模型的优势就体现出来了,因为它天 然不存在资源竞争和状态同步的问题。这就意味着,一旦某 个函数开始执行,就将执行到这个函数结束,而不会被其他 Dart 代码打断。
      所以,Dart 中并没有线程,只有 Isolate(隔离区)。 Isolates 之间不会共享内存,就像几个运行在不同进程中的 worker,通过事件循环(Event Looper)在事件队列 (Event Queue)上传递消息通信。

    相关文章

      网友评论

          本文标题:Dart的特性(JIT 与 AOT、内存分配与垃圾回收、单线程模

          本文链接:https://www.haomeiwen.com/subject/bkvrzltx.html