iOS app內存分析套路
Xcode下查看app內存使用情況有2中方法:
- Navigator導航欄中的Debug navigator中的Memory
- Instruments
一.Debug navigator中的Memory
此方法是查看內存最簡單直接有效的方法,真機調試時,通過Debug navigator中Memory查看app內存,入口如圖
根據這個值查看app內存占用,這個內存是當前app占用的總內存,是堆棧內存、虛擬內存(OpenGL占用的顯存算在虛擬內存中里面)的總和。
二.Instruments
啟動Instruments的方法是,Product->Profile,經過漫長的編譯時間后,出現Instruments界面,下圖
Instruments中,可以分析內存的工具有Activity Monitor,Allocations,Leaks。
(1)Leaks
Leaks檢測內存泄露的工具,很有用。Leaks運行中,看到下面這個紅叉叉就表示有內存泄露了
(2)Allocations
Allocations是檢測堆棧內存的,下面的VM tracker檢測虛擬內存。Allocations運行起來如下圖
Allocations永遠比Debug navigator Memory中顯示的內存要小,就是因為Allocations中沒有統計虛擬內存。iOS把OpenGL占用的顯存算作虛擬內存的一部分,下圖參考自
When is a Leak not a Leak? Using Heapshot Analysis to Find Undesirable Memory Growth
部分malloc出來的內存也算在虛擬內存中,下圖參考自A look at how malloc works on the Mac
(3)Activity monitor
Activity monitor看手機整體內存情況的,這里的顯示app內存值和Debug navigator中的Memory顯示的值是一樣的
其他:
1. app最多能占用多少內存不閃退
占用機器內存的一半左右就會閃退,和系統版本、后台程序數有關。
不同渠道對內存有不同的要求,例如如下某渠道
2. iOS app為什么內存沒有泄露,內存卻降不下來
eg: 創建大概20個哥布林spine動畫,此時內存占用46M,然后釋放掉,內存占用竟然還是46M,以為是spine有內存泄露,Leaks檢測沒有發現內存泄露。反復加載釋放20個哥布林,內存都沒有超過48M,但是為毛內存沒有下降,而是維持在46M左右?
因為(1)圖片加入了TextureCache,占用了部分內存(2)malloc出來的一部分內存算到了VM(虛擬內存)中,為了下次malloc速度更快,這部分內存雖然調用了free,但iOS系統依然沒有將其回收。這就是上面說的部分malloc出來的內存也算在虛擬內存中。
這可以在mac模擬器上測試,malloc一塊4M的內存,然后free之,內存不降
3. 怎么進行app內存測試
(1) 用Leaks檢測內存泄露
(2) 反復進入退出一個功能頁面,在Debug navigator中看內存是不是持續上升。內存持續上升說明內存漏了。