記憶體調試工具說明-示範,記憶體調試工具示範
在開發過程中,有時我們會遇到記憶體流失的情況。蘋果提供了一個強大Instruments工具來檢測iOS應用記憶體流失情況。
以下對Instruments工具進行簡單說明,通過執行個體示範檢測記憶體流失的問題。
Instruments是用於動態調追蹤和分析OS X和iOS的代碼的效能分析和測試載入器,支援多線程,可進行錄製和回放,圖形化使用者介面的操作過程。Instruments分析工具雖然很多,但是我們實際開發過程中並不能全部用到,下面簡單接收幾個常用的分析工具。
Leaks主要是查看記憶體使用量情況,檢查泄漏的記憶體,並提供了所有活動的分配和泄漏模組的類對象分配統計資訊以及記憶體位址記錄;
將工程ARC變更為MRC如:
建立類,聲明對象:
#import <Foundation/Foundation.h>@interface Person : NSObject@property(nonatomic, assign) NSString *str;@end
類比記憶體流失:
-(void)clickEvent{ Person *person = [[Person alloc] init]; [person retain]; person.str = @"test";}
- 運行項目,切換到iOS模擬器,點擊那個測試按鈕多點幾次“button”
- 切換到Instruments會發現 如果沒有泄漏
- 當然這裡是泄漏,在“Leaks”一欄裡有紅色的 X。六這就是記憶體泄露了。
Separate By Thread:線程分離,只有這樣才能在調用路徑中能夠清晰看到佔用CPU最大的線程.每個線程應該分開考慮。只有這樣你才能揪出那些大量佔用CPU的"重"線程,按線程分開做分析,這樣更容易揪出那些吃資源的問題線程。特別是對於主線程,它要處理和渲染所有的介面資料,一旦受到阻塞,程式必然卡頓或停止回應。
Invert Call Tree:從上到下跟蹤堆棧資訊.這個選項可以快捷的看到方法調用路徑最深方法佔用CPU耗時(這意味著你看到的表中的方法,將已從第0幀開始取樣,這通常你是想要的,只有這樣你才能看到CPU中話費時間最深的方法),比如FuncA{FunB{FunC}},勾選後堆棧以C->B->A把調用層級最深的C顯示最外面.反向輸出調用樹。把調用層級最深的方法顯示在最上面,更容易找到最耗時的操作。
Hide Missing Symbols:如果dSYM無法找到你的APP或者調用系統架構的話,那麼表中將看到調用方法名只能看到16進位的數值,勾選這個選項則可以隱藏這些符號,便於簡化分析資料.
Hide System Libraries:表示隱藏系統的函數,調用這個就更有用了,勾選後耗時調用路徑只會顯示app耗時的代碼,效能分析普遍我們都比較關係自己代碼的耗時而不是系統的.基本是必選項.注意有些代碼耗時也會納入系統層級,可以進行勾選前後前後對執行路徑進行比對會非常有用.因為通常你只關心cpu花在自己代碼上的時間不是系統上的,隱藏系統庫檔案。過濾掉各種系統調用,只顯示自己的代碼調用。隱藏缺失符號。如果 dSYM 檔案或其他系統架構缺失,列表中會出現很多奇怪的十六進位的數值,用此選項把這些幹擾元素屏蔽掉,讓列表迴歸清爽。
Show Obj-C Only: 只顯示oc代碼 ,如果你的程式是像OpenGl這樣的程式,不要勾選側向因為他有可能是C++的
Flatten Recursion: 遞迴函式, 每個堆疊追蹤一個條目,拼合遞迴。將同一遞迴函式產生的多條堆棧(因為遞迴函式會調用自己)合并為一條。
Top Functions:找到最耗時的函數或方法。 一個函數花費的時間直接在該函數中的總和,以及在函數調用該函數所花費的時間的總時間。因此,如果函數A調用B,那麼A的時間報告在A花費的時間加上B.花費的時間,這非常真有用,因為它可以讓你每次下到呼叫堆疊時挑最大的時間數字,歸零在你最耗時的方法。
- 需要添加其他工具的話:
- 左邊的Show the CPU Data 可以查看每個CPU的消耗情況
- 中間的Show the Instruments Data 顯示整體的消耗情況
- 右邊的Show the Thread Data 可以查看每個線程對CPU的消耗情況