Instruments 的介紹
Instruments 是一個很靈活的呕屎、強大的工具;是性能分析敬察、動態(tài)跟蹤 和分析 OS X 以及 iOS 代碼的測試工具秀睛;用它可以極為方便收集關(guān)于一個或多個系統(tǒng)進程的性能和行為的數(shù)據(jù),并能及時隨著時間跟蹤而產(chǎn)生的數(shù)據(jù)莲祸,并檢查所收集的數(shù)據(jù)蹂安,還可以廣泛收集不同類型的數(shù)據(jù);也可以追蹤程序運行的過程锐帜,這樣 instrument 就可以幫助我們了解用戶的應用程序和操作系統(tǒng)的行為田盈。
instrument 能做的事情
- 1.追蹤代碼中的(甚至是那些難以復制的)問題;
- 2.分析程序的性能缴阎;
- 3.實現(xiàn)程序的自動化測試允瞧;
- 4.部分實現(xiàn)程序的壓力測試;
- 5.執(zhí)行系統(tǒng)級別的通用問題追蹤調(diào)試蛮拔;
- 6.使你對程序的內(nèi)部運行過程更加了解痪枫。
介紹幾個常用的 instrument 工具
- 1莺禁、Leaks(泄漏):一般的查看內(nèi)存使用情況,檢查泄漏的內(nèi)存,并提供了所有活動的分配和泄漏模塊的類對象分配統(tǒng)計信息以及內(nèi)存地址歷史記錄事示;
- 2枯途、Time Profiler(時間探查):執(zhí)行對系統(tǒng)的 CPU上運行的進程低負載時間為基礎采樣惠毁。
- 3郑临、Allocations(內(nèi)存分配):跟蹤過程的匿名虛擬內(nèi)存和堆的對象提供類名和可選保留/釋放歷史
- 4、Activity Monitor(活動監(jiān)視器):顯示器處理的 CPU惋砂、內(nèi)存和網(wǎng)絡使用情況統(tǒng)計妒挎;
- 5、Automation(自動化):這個模板執(zhí)行它模擬用戶界面交互為 iOS 手機應用從 instrument 啟動的腳本西饵;
- 6酝掩、Core Data:監(jiān)測讀取、緩存未命中眷柔、保存等操作期虾,能直觀顯示是否保存次數(shù)遠超實際需要原朝。
- 7、Cocoa Layout:觀察約束變化镶苞,找出布局代碼的問題所在喳坠。
- 8、Network:跟蹤 TCP/IP 和 UDP/IP 連接茂蚓。
- 9壕鹉、Automations:創(chuàng)建和編輯測試腳本來自動化 iOS 應用的用戶界面測試。
使用 Instruments 的Leaks工具
- 1聋涨、由于 Leaks 是動態(tài)監(jiān)測晾浴,所以我們需要手動操作 APP,進行測試牍白,一邊操作 APP脊凰,一邊觀察 Leaks 的變化,在 暫停按鈕 的右邊 我們可以選擇正在 運行的程序 & 選擇設備 & App, 之后點擊 紅點 Record(紅色圓圈按鈕)運行
- 2茂腥、觀察狸涌,如果發(fā)現(xiàn)在 Leaks 里面有一個 紅色X,這說明了我們的 APP 存在內(nèi)存泄露最岗。
- 3帕胆、點擊暫停,點擊其中一個仑性,然后我們開始分析。(也可繼續(xù)檢測右蹦,當多個時暫停诊杆,一次處理了多個
- 4、下面就是定位修改了, 此時選中有紅色叉的 Leaks何陆,下面有個 田 Leaks 字方格晨汹,點開,選中
Call Tree
贷盲。
- 5淘这、接著就是最關(guān)鍵的一步,在這個界面的右下角有若干選框巩剖,選中Invert Call Tree 和 Hide System Libraries,(紅圈范圍內(nèi))如果不知道在那個位置請接著往下看
- 6铝穷、定位:在詳情面板選中顯示的若干條中的一條,雙擊佳魔,會自動跳到內(nèi)存泄露代碼處曙聂,然后點擊右上角 Xcode 圖標進行修改。
概念解釋
1鞠鲜、Separate By Thread: 線程分離,只有這樣才能在調(diào)用路徑中能夠清晰看到占用CPU最大的線程.每個線程應該分開考慮宁脊。只有這樣你才能揪出那些大量占用CPU的"重"線程断国,按線程分開做分析,這樣更容易揪出那些吃資源的問題線程榆苞。特別是對于主線程稳衬,它要處理和渲染所有的接口數(shù)據(jù),一旦受到阻塞坐漏,程序必然卡頓或停止響應薄疚。
2、Invert Call Tree: 從上到下跟蹤堆棧信息.這個選項可以快捷的看到方法調(diào)用路徑最深方法占用CPU耗時(這意味著你看到的表中的方法,將已從第0幀開始取樣,這通常你是想要的,只有這樣你才能看到CPU中話費時間最深的方法),比如FuncA{FunB{FunC}},勾選后堆棧以C->B->A把調(diào)用層級最深的C顯示最外面.反向輸出調(diào)用樹仙畦。把調(diào)用層級最深的方法顯示在最上面输涕,更容易找到最耗時的操作。
3慨畸、Hide Missing Symbols:如果dSYM無法找到你的APP或者調(diào)用系統(tǒng)框架的話莱坎,那么表中將看到調(diào)用方法名只能看到16進制的數(shù)值,勾選這個選項則可以隱藏這些符號,便于簡化分析數(shù)據(jù).
4寸士、Hide System Libraries: 表示隱藏系統(tǒng)的函數(shù)檐什,調(diào)用這個就更有用了,勾選后耗時調(diào)用路徑只會顯示app耗時的代碼,性能分析普遍我們都比較關(guān)系自己代碼的耗時而不是系統(tǒng)的.基本是必選項.注意有些代碼耗時也會納入系統(tǒng)層級,可以進行勾選前后前后對執(zhí)行路徑進行比對會非常有用.因為通常你只關(guān)心cpu花在自己代碼上的時間不是系統(tǒng)上的弱卡,隱藏系統(tǒng)庫文件乃正。過濾掉各種系統(tǒng)調(diào)用,只顯示自己的代碼調(diào)用婶博。隱藏缺失符號瓮具。如果 dSYM 文件或其他系統(tǒng)架構(gòu)缺失,列表中會出現(xiàn)很多奇怪的十六進制的數(shù)值凡人,用此選項把這些干擾元素屏蔽掉名党,讓列表回歸清爽。
內(nèi)存泄漏動態(tài)分析技巧
- 1挠轴、在 Display Settings 界面建議把 Snapshot Interval (snap??t, 數(shù)據(jù)快照)間隔時間設置為10秒传睹,勾選Automatic Snapshotting,Leaks 會自動進行內(nèi)存捕捉分析岸晦。(新版本直接在底部修改)
- 2欧啤、熟練使用 Leaks 后會對內(nèi)存泄漏判斷更準確,在可能導致泄漏的操作里启上,在你懷疑有內(nèi)存泄漏的操作前和操作后邢隧,可以點擊 Snapshot Now 進行手動捕捉。
- 3冈在、開始時如果設備性能較好府框,可以把自動捕捉間隔設置為 5 秒鐘。
- 4、使用ARC的項目迫靖,一般內(nèi)存泄漏都是 malloc院峡、自定義結(jié)構(gòu)、資源引起的系宜,多注意這些地方進行分析照激。
- 5、開啟ARC后盹牧,內(nèi)存泄漏的原因
開啟了ARC并不是就不會存在內(nèi)存問題俩垃,蘋果有句名言:ARC is only for NSObject。
注:如果你的項目使用了ARC汰寓,隨著你的操作口柳,不斷開啟或關(guān)閉視圖,內(nèi)存可能持續(xù)上升有滑,但這不一定表示存在內(nèi)存泄漏跃闹,ARC釋放的時機是不固定的。
補充
- 1毛好、Extended Detail
Extended Detail 擴展面板(?k?st?nd,延展 di?te?l,細節(jié)詳情)望艺,在時間探查儀器的情況下,它是用來跟蹤顯示堆棧肌访。
- 2找默、Record Settings 記錄設置
使用 Instruments的Time Profiler工具
Time Profiler分析原理:它按照固定的時間間隔來跟蹤每一個線程的堆棧信息,通過統(tǒng)計比較時間間隔之間的堆棧狀態(tài)吼驶,來推算某個方法執(zhí)行了多久惩激,并獲得一個近似值。其實從根本上來說與我們的原始分析方法異曲同工蟹演,只不過其將各個方法消耗的時間統(tǒng)計起來风钻。
用來檢測app中每個方法所用的時間,并且可以排序轨帜,并查找出哪些函數(shù)占用了大量時間魄咕。頁面如下
我們可以發(fā)現(xiàn)這段時間內(nèi)因為我項目里面使用了Charts
占用了很大的一段時間消耗
使用 Instruments 的Allocations工具
內(nèi)存泄漏衩椒。其實有兩種泄漏蚌父。
- 第一個是真正的內(nèi)存泄漏,一個對象尚未被釋放毛萌,但是不再被引用的了苟弛。因此,存儲器不能被重新使用阁将。
- 第二類泄漏是比較麻煩一些膏秫。這就是所謂的“無界內(nèi)存增長”。這發(fā)生在內(nèi)存繼續(xù)分配做盅,并永遠不會有機會被釋放缤削。
如果永遠這樣下去你的程序占用的內(nèi)存會無限大,當超過一定內(nèi)存的話 會被系統(tǒng)殺死
兩種檢測內(nèi)存泄漏的方法
- 1窘哈、靜態(tài)內(nèi)存分析--> Analyze
- 2、動態(tài)內(nèi)存分析(Profile == Instruments )
靜態(tài)內(nèi)存分析--> Analyze
分析到哪里有內(nèi)存泄露 ( an(?)l??z 愛ne來z 對...分析)
1.不運行程序亭敢, app沒有了Crash,直接對代碼進行內(nèi)存分析滚婉,查看一下代碼是否有內(nèi)存泄露
優(yōu)點:分析速度快,并且可以對所有的代碼進行內(nèi)存分析
缺點:分析結(jié)果不一定準確(沒有運行程序帅刀,根據(jù)代碼的上下文語法結(jié)構(gòu))
2.注意:如果有提示有內(nèi)存泄露让腹,一定結(jié)合代碼查看代碼是否有問題
操作步驟:
1、Analyze是靜態(tài)分析工具 可以通過菜單 Product→Analyze啟動
或者
2扣溺、(shift+command+b) 圖八
動態(tài)內(nèi)存分析
真正運行程序骇窍,對程序進行內(nèi)存分析(查看內(nèi)存分配情況、內(nèi)存泄露)
優(yōu)點:分析非常準確锥余,如果發(fā)現(xiàn)有提示內(nèi)存泄露腹纳,基本可以斷定代碼問題
缺點:分析效率低(真正運行了一段代碼,才能對該代碼進行內(nèi)存分析)
注意點:如果發(fā)現(xiàn)有內(nèi)存泄露哈恰,基本需要修改代碼(基本有內(nèi)泄露)
操作步驟: Product -->Profile-->Allocations
二.內(nèi)存使用注意
- 1.加載小圖片\使用頻率比較高的圖片
- 利用
imageNamed:
方法加載過的圖片, 永遠有緩存, 這個緩存是由系統(tǒng)管理的, 無法通過代碼銷毀緩存
- 利用
- 2.加載大圖片\使用頻率比較低的圖片(一次性的圖片, 比如版本新特性的圖片)
- 利用
initWithContentsOfFile:\imageWithContentsOfFile:\imageWithData:
等方法加載過的圖片, 沒有緩存, 只要用完了, 就會自動銷毀 - 基本上, 除
imageNamed:
方法以外, 其他加載圖片的方式, 都沒有緩存
- 利用
三.2個專業(yè)術(shù)語
- 1.內(nèi)存泄漏:該釋放的對象, 沒有被釋放(已經(jīng)不再使用的對象, 沒有被釋放)
- 2.內(nèi)存溢出(Out Of Memory)
- 1只估、內(nèi)存不夠用了
- 2、數(shù)據(jù)長度比較小的數(shù)據(jù)類型 存儲了 數(shù)據(jù)長度比較大的數(shù)據(jù)
四.圖片在沙盒中的存在形式(d??pl??m(?)nt,部署)
- 1.如果項目的Deployment Target <= 6.x (不支持圖片壓縮)
- 1着绷、 所有圖片直接暴露在沙盒的資源包(main Bundle), 不會壓縮到Assets.car文件
- 2.如果項目的Deployment Target >= 7.x (支持圖片壓縮)
- 1蛔钙、 放在Images.xcassets里面的所有圖片會壓縮到Assets.car文件, 不會直接暴露在沙盒的資源包(main Bundle)
- 2、 沒有放在Images.xcassets里面的所有圖片會直接暴露在沙盒的資源包(main Bundle), 不會壓縮到Assets.car文件
- 3.總結(jié)
- 1荠医、 會壓縮到Assets.car文件, 沒有直接暴露在沙盒的資源包(main Bundle)