使用Instruments可以監測分析app內存相關的 Overall Memory Use、 Leaked Memory、 Abandoned Memory、 Zombies等內容。
1、 Allocations
點擊XCode的Product菜單Profile啟動Instruments,選擇allocation,會自動啟動allocation工具和模擬器。啟動后,Allocations面板顯示內存中的對象占用曲線,可以顯示目前內存中分配了哪些對象,對象的數量,以及由哪些函數進行創建的。
Allocations可以監測到app中一般和虛擬內存的使用情況。統計到的內存類別有All Heap & Anonymous VM、All Heap Allocations、All Anonymous VM。我們無法控制Anonymous VM部分,所以一般只關注All Heap Allocations。
可以對每個動作的前后進行Generations,對比內存的增加,查看使內存增加的具體的方法和代碼所在位置。具體操作是在右側Generation Analysis里點擊Mark Generation,這樣會產生一個Generation,切換到其他頁面或一段時間產生了另外一個事件時再點Mark Generation來產生一個新的Generation,這樣反復,生成多個Generation,查看這幾個Generation會看到Growth的大小,如果太大可以點進去查看相應占用較大的線程里右側Heaviest Stack Trace里查看對應的代碼塊,然后進行相應的處理。
Detail Pane中統計信息包含的類型:Statistics、Call Trees、Allocations List、Generations。
1>Statistics統計項:
2>Call Trees統計項:
3>Allocations List統計項:
4>Generations統計項:
2、Zombies
使用Zombies工具來查找僵尸對象: Zombies工具的查找原理其實和設置NSZombieEnabled環境變量的調試方法是一樣的,啟動Zombies后在內部設置了NSZombieEnabled為true。
啟用了NSZombieEnabled的話,它會用一個僵尸對象來代替已釋放對象。也就是在引用計數降到0時,該僵尸實現會將該對象轉換成僵尸對象。僵尸對象的作用是在你向它發送消息時,就不會向之前那樣Crash或者產生 一個難以理解的行為,而是放出一個錯誤消息,它會顯示一段日志并自動跳入調試器, 因此我們就可以找到具體或者大概是哪個對象被錯誤的釋放了。
3、Leaks
啟動Leaks工具后,它會在程序運行時記錄內存分配信息和檢查是否發生內存泄露。
定位內存泄漏問題:點擊Leak Checks時間條的紅色叉,查看某行內存泄漏調用棧,會直接跳到內存泄漏代碼位置。
Details Pane包含的統計信息有:Leaks、Cycles &Roots、Call Tree。
1>Leaks統計項:
2>Cycles&Roots統計項: