使用Instruments可以監(jiān)測分析app內(nèi)存相關(guān)的 Overall Memory Use、 Leaked Memory、 Abandoned Memory随闺、 Zombies等內(nèi)容。
1、 Allocations
點擊XCode的Product菜單Profile啟動Instruments痴晦,選擇allocation,會自動啟動allocation工具和模擬器琳彩。啟動后誊酌,Allocations面板顯示內(nèi)存中的對象占用曲線,可以顯示目前內(nèi)存中分配了哪些對象露乏,對象的數(shù)量碧浊,以及由哪些函數(shù)進行創(chuàng)建的。
Allocations可以監(jiān)測到app中一般和虛擬內(nèi)存的使用情況瘟仿。統(tǒng)計到的內(nèi)存類別有All Heap & Anonymous VM箱锐、All Heap Allocations、All Anonymous VM劳较。我們無法控制Anonymous VM部分驹止,所以一般只關(guān)注All Heap Allocations。
可以對每個動作的前后進行Generations观蜗,對比內(nèi)存的增加臊恋,查看使內(nèi)存增加的具體的方法和代碼所在位置。具體操作是在右側(cè)Generation Analysis里點擊Mark Generation墓捻,這樣會產(chǎn)生一個Generation抖仅,切換到其他頁面或一段時間產(chǎn)生了另外一個事件時再點Mark Generation來產(chǎn)生一個新的Generation,這樣反復,生成多個Generation撤卢,查看這幾個Generation會看到Growth的大小环凿,如果太大可以點進去查看相應(yīng)占用較大的線程里右側(cè)Heaviest Stack Trace里查看對應(yīng)的代碼塊,然后進行相應(yīng)的處理凸丸。
Detail Pane中統(tǒng)計信息包含的類型:Statistics拷邢、Call Trees、Allocations List屎慢、Generations瞭稼。
1>Statistics統(tǒng)計項:
2>Call Trees統(tǒng)計項:
3>Allocations List統(tǒng)計項:
4>Generations統(tǒng)計項:
2、Zombies
使用Zombies工具來查找僵尸對象: Zombies工具的查找原理其實和設(shè)置NSZombieEnabled環(huán)境變量的調(diào)試方法是一樣的腻惠,啟動Zombies后在內(nèi)部設(shè)置了NSZombieEnabled為true环肘。
啟用了NSZombieEnabled的話,它會用一個僵尸對象來代替已釋放對象集灌。也就是在引用計數(shù)降到0時悔雹,該僵尸實現(xiàn)會將該對象轉(zhuǎn)換成僵尸對象。僵尸對象的作用是在你向它發(fā)送消息時欣喧,就不會向之前那樣Crash或者產(chǎn)生 一個難以理解的行為腌零,而是放出一個錯誤消息,它會顯示一段日志并自動跳入調(diào)試器唆阿, 因此我們就可以找到具體或者大概是哪個對象被錯誤的釋放了益涧。
3、Leaks
啟動Leaks工具后驯鳖,它會在程序運行時記錄內(nèi)存分配信息和檢查是否發(fā)生內(nèi)存泄露闲询。
定位內(nèi)存泄漏問題:點擊Leak Checks時間條的紅色叉,查看某行內(nèi)存泄漏調(diào)用棧浅辙,會直接跳到內(nèi)存泄漏代碼位置扭弧。
Details Pane包含的統(tǒng)計信息有:Leaks、Cycles &Roots记舆、Call Tree鸽捻。
1>Leaks統(tǒng)計項:
2>Cycles&Roots統(tǒng)計項: