Flutter以使用Dart語言為主募寨,其內(nèi)存管理機(jī)制與Java有一定的相似性,Dart中有一個(gè)垃圾收集器的概念审葬,
Dart的垃圾收集器是分代的(新生代(New Generation)和老年代(Old Generation))深滚,由兩個(gè)部分組成:
1.新生代空間收集器
2.并行標(biāo)記掃描收集器
新生代用來存儲(chǔ)生命周期較短的對(duì)象,由兩個(gè)內(nèi)存空間組成涣觉,Active內(nèi)存空間用來分配新對(duì)象痴荐,inActive內(nèi)存空間用來作為備用空間,DartVM的內(nèi)存分配策略非常簡(jiǎn)單官册,創(chuàng)建對(duì)象時(shí)只需要在現(xiàn)有堆上移動(dòng)指針生兆,內(nèi)存增長(zhǎng)始終是線形的,省去了查找可用內(nèi)存段的過程膝宁。每個(gè)Isolate有自己獨(dú)立的Heap鸦难,相互之間無法共享內(nèi)存,這樣可以實(shí)現(xiàn)無鎖的快速分配员淫。
一旦Active的內(nèi)存空間被填滿合蔽,垃圾回收器會(huì)從根對(duì)象開始遍歷檢查檢查所有對(duì)象的引用狀態(tài),沒有被引用的對(duì)象標(biāo)記為dead狀態(tài)介返,非dead狀態(tài)的對(duì)象在下次內(nèi)存回收事件中會(huì)被復(fù)制到inActive內(nèi)存空間拴事,清除Active內(nèi)存空間沃斤,最后Active和inActive內(nèi)存空間狀態(tài)調(diào)換。
另外還有調(diào)度器
由這三個(gè)部分組成了垃圾收集器
調(diào)度器
在Flutter引擎中挤聘,為了最小化垃圾收集對(duì)應(yīng)用程序和UI性能的印象轰枝,與垃圾收集器提供了hook,當(dāng)引擎檢測(cè)到應(yīng)用程序處于空閑狀態(tài)(沒有與用戶交互)组去,會(huì)發(fā)出警報(bào)鞍陨,為垃圾收集器提供運(yùn)行其收集階段而不影響性能的機(jī)會(huì)。并且垃圾收集器可以在這些空閑時(shí)間運(yùn)行內(nèi)存壓縮从隆,從而較少內(nèi)存碎片來優(yōu)化內(nèi)存诚撵。
從以下flutter - iOS程序內(nèi)存情況中可以明顯的看出在1處沒有用戶交互的情況下Flutter引擎中的垃圾收集器開始工作,稍候在2處內(nèi)存有明顯釋放的痕跡键闺。
新生代空間收集器
此部分類似于Java的復(fù)制算法寿烟,用于清理壽命較短的對(duì)象,例如Stateless部件辛燥,雖然是會(huì)阻塞線程筛武,但當(dāng)與調(diào)度器結(jié)合使用,幾乎感知不到應(yīng)用程序在運(yùn)行期間的暫停挎塌,從本質(zhì)上徘六,新建的對(duì)象被分配給內(nèi)存中的連續(xù)空間,在新建對(duì)象榴都,會(huì)被分配到下一個(gè)可用空間待锈,直到填充完分配的內(nèi)存,但Dart使用的是一個(gè)凹凸的指針嘴高,所以這個(gè)過程非掣鸵簦快,分配新對(duì)象的空間由兩部分組成拴驮,任何時(shí)候只用一半春瞬,當(dāng)一半滿后,活動(dòng)的對(duì)象將復(fù)制到另一半空間中套啤,一半就會(huì)全部清空宽气,確定對(duì)象是否活動(dòng),收集器以根對(duì)象開始纲岭,進(jìn)行檢測(cè)他們引用的內(nèi)容,這一部分類似于Java的可達(dá)性算法线罕,有引用的對(duì)象將會(huì)被復(fù)制到另一個(gè)空間中止潮。
并行標(biāo)記掃描收集器
當(dāng)對(duì)象達(dá)到一定的生命周期時(shí),會(huì)被提上到另一個(gè)新的內(nèi)存空間钞楼,由另一個(gè)收集器管理喇闸,此收集器有兩個(gè)階段:
遍歷對(duì)象,標(biāo)記仍在使用的對(duì)象
掃描整個(gè)存儲(chǔ)器,并回收未標(biāo)記的對(duì)象燃乍,然后清除所有標(biāo)記唆樊。