Weex-iOS內(nèi)存分析

前言

引入weex提高了業(yè)務開發(fā)的效率以及靈活度,但是在使用過程中還是存在不少問題,其中內(nèi)存上就有很明顯的問題

一、weex頁面與原生頁面對比存在的內(nèi)存問題

1府寒、weex頁面內(nèi)存開銷過大

如圖進行頁面切換:


在進行到weex頁面的時候內(nèi)存暴漲。

2报腔、頁面Push跳轉(zhuǎn)堆棧內(nèi)存泄漏株搔。

從首頁Push跳轉(zhuǎn)到weex頁面,加載數(shù)據(jù)纯蛾,再返回纤房,重復多次得出下圖的結(jié)果:

而Push跳轉(zhuǎn)到原生頁面再返回,重復多次得出下圖內(nèi)存結(jié)果:

從上面兩張圖可以看出:原生頁面返回后從堆棧移除后會進內(nèi)存回收翻诉;而從weex頁面回到首頁炮姨,內(nèi)存沒有完全回收捌刮,存在一定的內(nèi)存泄漏,重復多次可以看到內(nèi)存相比較一開始會有明顯的增加舒岸。

3绅作、列表滑動的內(nèi)存情況

在沒有采用<list>和<cell>標簽的情況下:

weex頁面列表滑動內(nèi)存情況如圖:
weex頁面滑動內(nèi)存情況

通過趨勢圖列表滑動過程中內(nèi)存一直持續(xù)暴漲,沒有進行復用減少內(nèi)存開銷蛾派。

原生頁面列表滑動內(nèi)存情況如圖:
原生頁面滑動內(nèi)存情況

從圖中可以看到棚蓄,在滑動初始階段,內(nèi)存增長比較快碍脏,之后的滑動過程中對前面的控件進行復用,內(nèi)存開銷減少稍算,曲線變得平緩典尾,沒有出現(xiàn)內(nèi)存持續(xù)暴漲。

4糊探、 weex頁面內(nèi)存問題總結(jié):

1钾埂、weex頁面滑動沒有采用復用機制,導致內(nèi)存會跟著滑動持續(xù)暴漲
2科平、weex頁面占用內(nèi)存開銷過高褥紫,多個weex頁面可能導致APP因為內(nèi)存過大而Crash。
3瞪慧、weex頁面從堆棧移除內(nèi)存沒有完全回收髓考,存在一定的內(nèi)存泄漏。

二弃酌、內(nèi)存問題原因分析

1氨菇、滑動過程內(nèi)存持續(xù)暴漲問題

weex官方文檔上,建議使用高性能可復用<cell><list>妓湘,而【搜索頁】查蓉、【樂瘋搶】等weex頁面業(yè)務代碼中直接采用了<div><scroller>實現(xiàn)列表的布局,導致內(nèi)存問題的出現(xiàn)榜贴。

這里我們通過Weex源碼豌研,對四個標簽進行分析

可以在WXSDKEngine 中可以看出各個標簽對應的類:

<div> 對應WXComponent
<scroller>對應WXScrollerComponent
<cell>對應WXCellComponent
<list>對應WXListComponent
<div>

<div>對應的WXComponent 相當于原生iOS控件的UIView,是所有視圖的基類唬党,一個普通的視圖沒有性能優(yōu)化鹃共、復用回收的機制。

<scroller>

<scroller>對應的WXScrollerComponent結(jié)構(gòu)如下:


并無相關(guān)復用回收的屬性初嘹,主要是提供一個可以滑動的容器及汉。

<cell>

查看<cell>對應WXCellComponent類的實現(xiàn)代碼可以發(fā)現(xiàn),WXCellComponent相比較WXComponent 擁有復用回收的相關(guān)屬性isRecycle

<list>

<list>對應的WXListComponent的結(jié)構(gòu)如圖:


在成員列表中可以看到使用了iOS原生的UITableView屯烦,并且實現(xiàn)了使用了UITableView的代理方法坷随,實現(xiàn)了iOS的復用機制房铭,如圖:

同時WXListComponent實現(xiàn)了WXCellComponent中的代理方法,WXCellComponentWXListComponent相關(guān)聯(lián)系温眉。

因此<list>基于iOS的UITableView復用機制缸匪,實現(xiàn)高性能了可復用的列表容器。
結(jié)合<cell>可以實現(xiàn)一個高性能的列表展示頁面类溢。

因此采用<list><cell>代替<scroller><div>解決滑動列表內(nèi)存暴漲的問題凌蔬。

2、weex頁面內(nèi)存開銷過高的問題

通過Instrument工具進行內(nèi)存分析闯冷,發(fā)現(xiàn)在進入weex 頁面時VM ImageIO_GIF_DataVM ImageIO兩個對象內(nèi)存異常暴漲砂心。

VM ImageIO_GIF_Data 內(nèi)存增長情況:
VM ImageIO 內(nèi)存增長情況:


VM ImageIO_GIF_Data 由7.92M增長到16.55M,VM ImageIO由0.11M增長到了1.02M,進入Weex頁面時蛇耀,這兩個對象總共增加了9.54M辩诞,而整個Weex頁面初始狀態(tài)占用內(nèi)存為15M左右(原生【商品詳情】頁:7M左右),占據(jù)了整個Weex頁面內(nèi)存的約60%纺涤。
而在原生頁面中译暂,VM ImageIO_GIF_DataVM ImageIO對象幾乎沒有增長。
而這兩個對象與CoreGraphics中進行圖片繪制撩炊、圖片渲染外永、圖片讀寫等相關(guān)方法有關(guān),而CoreGraphics為相對底層的模塊拧咳,相關(guān)方法比較消耗性能伯顶、內(nèi)存,并且容易產(chǎn)生內(nèi)存泄漏呛踊。
初步可以判定砾淌,weex中大量調(diào)用了CoreGraphics中圖片處理的相關(guān)方法,導致了weex頁面內(nèi)存開銷過大谭网。

接著在WeexSDK的源碼中查找CoreGraphics相關(guān)方法汪厨,定位問題。
在查找過程發(fā)現(xiàn)愉择,weex通過CoreGraphics繪圖方法將<text>等控件實例繪制成位圖進行顯示劫乱,以適應weex中的CSS布局。
WXComponent+Display 中锥涕,可以看到將控件繪制成圖片的代碼衷戈,并在layer上顯示:

通過這部分的代碼可以定位到weex頁面內(nèi)存開銷過大的主要原因是: weex SDK 調(diào)用了CoreGraphics方法將頁面中的<text>等控件繪制成圖片再布局顯示,占用了大量的內(nèi)存层坠。

weex的內(nèi)存泄漏也與大量調(diào)用了CoreGraphics中方法有關(guān)殖妇。

通過Leaks工具定位到weex頁面內(nèi)存泄漏對象為CGDataProviderCreateWithCopyOfData



CGDataProviderCreateWithCopyOfData為調(diào)用CoreGraphics相關(guān)方法產(chǎn)生的對象。
weex SDK調(diào)用CoreGraphics中的相關(guān)方法破花,但是沒有及時地釋放對象谦趣,導致了內(nèi)存泄漏疲吸。

weex SDK 大量CoreGraphics方法將控件繪制成圖片再布局顯示,占用了大量的內(nèi)存前鹅,同時也導致了資源回收不及時的問題摘悴。

解決方案:

1、限制堆棧中weex頁面?zhèn)€數(shù):
天貓采用的也是該方案舰绘,通過控制頁面級數(shù)蹂喻,控制內(nèi)存,防止因為堆棧過多的weex頁面捂寿,內(nèi)存過大導致異常Crash口四。
2、頁面復用:
在打開weex頁面前秦陋,判斷堆棧中是否有該weex頁面窃祝,如果有便進行頁面復用,通過數(shù)據(jù)刷新頁面踱侣,同時通過調(diào)整堆棧將頁面顯示出來。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末大磺,一起剝皮案震驚了整個濱河市抡句,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌杠愧,老刑警劉巖待榔,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異流济,居然都是意外死亡锐锣,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門绳瘟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雕憔,“玉大人,你說我怎么就攤上這事糖声〗锉耍” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵蘸泻,是天一觀的道長琉苇。 經(jīng)常有香客問我,道長悦施,這世上最難降的妖魔是什么并扇? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮抡诞,結(jié)果婚禮上穷蛹,老公的妹妹穿的比我還像新娘土陪。我一直安慰自己,他們只是感情好俩莽,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布旺坠。 她就那樣靜靜地躺著,像睡著了一般扮超。 火紅的嫁衣襯著肌膚如雪取刃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天出刷,我揣著相機與錄音璧疗,去河邊找鬼。 笑死馁龟,一個胖子當著我的面吹牛崩侠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坷檩,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼却音,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了矢炼?” 一聲冷哼從身側(cè)響起系瓢,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎句灌,沒想到半個月后夷陋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡胰锌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年骗绕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片资昧。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡酬土,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出格带,到底是詐尸還是另有隱情诺凡,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布践惑,位于F島的核電站腹泌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏尔觉。R本人自食惡果不足惜凉袱,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧专甩,春花似錦钟鸵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至种樱,卻和暖如春蒙袍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嫩挤。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工害幅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人岂昭。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓以现,卻偏偏與公主長得像,于是被迫代替她去往敵國和親约啊。 傳聞我的和親對象是個殘疾皇子邑遏,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容