Flutter
主要使用Dart
开发语言,在调试和发布两个版本中,Dart RunTime
是始终存在,但两种版本下的构建方式有很大的差异
Dart RunTime
2.jit(Android下的实时编译器)/interpreter(IOS下的解析器)
3.调试和分析服务Dart RunTime
两种模式下都存在Dart RunTime
,它包含了垃圾收集器,是实例化对象并变得无法访问时分配和释放内存的必要组件。
对于Flutter而言,会创建很多对象:例如Stateless Widget
从创建到应用程序的状态发生改变或者变得不再可见时被销毁和重建,大多数对象的生命周期是短暂的,若应用程序的UI变得相对复杂,可运行至上千个小部件
对于上面而言,很多人之前认为Flutter为什么不用Java
写,为什么不用Object-C
写,为什么不用JavaScript
写,对于这些语言真的能胜任这么频繁的创建销毁吗?
native
服务,例如C、C++方法
3.方法区:存储被虚拟机加载的类信息、常量、静态变量、即使编译器编译后的数据等
4.堆区:所有通过new
创建的对象的内存都在堆中分配,堆内存分为新的和旧的,刚new
出来的对象放在新生代存储,当内存不足时,虚拟机会通过一系列算法把新生对象移动到旧生代中去OC在早期版本中缺少较为完善的内存管理机制,需要开发者手动进行释放,在Xcode4.2之后引入了ARC(Automatic Reference Counting)机制。
assign
对应关键字__unsafe_unretained
,指向的对象被释放的时候,仍然指向之前的地址,容易引起野指针copy
对应关键字__strong
,在赋值的时候,调用copy
方法retain
对应关键字__strong
strong
对应关键字__strong
unsafe_unretained
对应关键字unsafe_unretained
weak
对应关键字weak
retain
增加引用计数release
降低引用计数,当引用计数为0时释放对象autorelease
在当前的auto release pool结束后,降低引用计数javaScript 具有垃圾自动收集机制,垃圾收集器会按照固定的时间间隔,周期性地执行这一炒作,具体到浏览器的实现,也可以指定收集时间
Dart的垃圾收集器是分代的,由两个部分组成:新生代空间收集器、并行标记扫描收集器,还有一个重要的东西,就是调度器
Stateless
部件,虽然是会阻塞线程,但当与调度器结合使用,几乎感知不到应用程序在运行期间的暂停,从本质上,新建的对象被分配给内存中的连续空间,在新建对象,会被分配到下一个可用空间,直到填充完分配的内存,但Dart使用的是一个凹凸的指针,所以这个过程非常快,分配新对象的空间由两部分组成,任何时候只用一半,当一半满后,活动的对象将复制到另一半空间中,一半就会全部清空,确定对象是否活动,收集器以根对象开始,进行检测他们引用的内容,这一部分类似于Java的可达性算法,有引用的对象将会被复制到另一个空间中由上面所述,Dart的垃圾收集器方式参考了部分语言的实现,但需要注意的是,Dart的isolates拥有自己的私有堆,彼此是独立的,每个isolates运行在单独的线程中,每个ioslates的垃圾收集事件不影响其它isolates的性能,所以isolates可以避免UI出现卡顿和很好的进行频繁的回收操作,这就是dart作为Flutter的主要语言的原因之一。