iOS app記憶體分析套路 Xcode下查看app記憶體使用情況有2中方法: 一.Debug navigator中的Memory 此方法是查看記憶體最簡單直接有效的方法,真機調試時,通過Debug navigator中Memory查看app記憶體,入口如圖 根據這個值查看app記憶體占用,這個記憶體是當前ap ...
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中看記憶體是不是持續上升。記憶體持續上升說明記憶體漏了。