TODO ?List:
1.Try to finish clean up all git and fabric issue.2
2.Write an article about the Memory performance optimization
Actual List:
1.Still pending for the git and fabric issues.
Memory Optimization
前言:最近遇到iPad在剛啟動(dòng)之后,過(guò)1分鐘就會(huì)Crash的問(wèn)題,然后在Fabric上查不到對(duì)應(yīng)的崩潰棧信息俏橘。根據(jù)經(jīng)驗(yàn)挪拟,找不到Crash要么是系統(tǒng)安全退出(切換設(shè)置),要么就是OOM。
調(diào)查:1.首先這個(gè)crash 是可以穩(wěn)定重現(xiàn)的,這個(gè)是能修復(fù)該邏輯的前提
? ? ? ? ? ? 2.通過(guò)觀察在控制臺(tái)的log輸出情況發(fā)現(xiàn)了:
Nov 30 16:09:18 -iPad MyApp(UIKit)[35527]: Received memory warning.
Nov 30 16:09:25 -iPad SpringBoard(FrontBoard)[4918]:was killed by jetsam.
Nov 30 16:09:25 -iPad SpringBoard[4918]: Process exited:->
就在收到Memory Warning 時(shí)便被殺掉,這樣就可以斷定是OOM引起的娃弓。
分析:1.確定了是OOM之后,我們左手開(kāi)始分析原因
Activity Monitor: 能給從全局看到當(dāng)前App在整個(gè)設(shè)備中的使用情況岛宦,包括真實(shí)占用內(nèi)存(當(dāng)然也可以看到在應(yīng)用被殺掉 的內(nèi)存情況)台丛,線(xiàn)程數(shù)量,CPU使用情況等砾肺。
Allocations:在使用AM有了一個(gè)總體概括是挽霉,這時(shí)候需要使用它對(duì)內(nèi)存分配能夠比較細(xì)致的觀察,它提供了幾個(gè)比較有用的視圖:
Statistics: 可以看到整個(gè)看到整個(gè)內(nèi)存配分對(duì)象的概況
CallTree:個(gè)人覺(jué)得非常有用变汪,特別是配合“Invert Call Tree” 和 “Hide the system libraries”使用時(shí)侠坎,能給幫助你很快定位到耗內(nèi)存最多的對(duì)象是如何通過(guò)應(yīng)用代碼調(diào)用過(guò)去的。(同理也可以應(yīng)用在Time Profile).
2.通過(guò)用Call Tree 視圖分析發(fā)現(xiàn)是由于開(kāi)機(jī)后反復(fù)大量調(diào)用該方法造成的問(wèn)題裙盾,自此找到了核心問(wèn)題點(diǎn)实胸。
3.總結(jié):個(gè)人認(rèn)為解決內(nèi)存或CPU問(wèn)題的核心在于:
????????????????????1.能穩(wěn)定重現(xiàn)(包括固定的起始點(diǎn)),比如每次開(kāi)機(jī)之后什么都不做過(guò)30s就崩潰
? ? ? ? ? ? ? ? ? ? 2.使用Activity Monitor 粗略且全局觀察應(yīng)用當(dāng)前的內(nèi)存/CPU消耗番官,從而了解到這一問(wèn)題帶來(lái)的內(nèi)存/CPU開(kāi)銷(xiāo)值
? ? ? ? ? ? ? ? ? ? 3.使用 如Allocations/Time Profiler 進(jìn)行細(xì)節(jié)調(diào)查庐完,按照消耗內(nèi)存最多/CPU最多排序,快速定位應(yīng)用代碼中最多的調(diào)用
? ? ? ? ? ? ? ? ? ? 4.定位到問(wèn)題代碼后徘熔,通過(guò)嘗試簡(jiǎn)單去掉假褪,觀察是否解決了這一問(wèn)題,如果是近顷,找到優(yōu)化這塊代碼的方法,如果否宁否,說(shuō)明并沒(méi)有找到根源窒升,需要重復(fù)步驟3.
? ? ? ? ? ? ? ? ? ? 5.完成步驟四之后,我們可以在使用Activity Monitor記錄優(yōu)化后的結(jié)果慕匠,以便可以跟優(yōu)化前做對(duì)比饱须。