iOS Instruments 學習

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.png

介紹幾個常用的 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工具

Leaks.png
  • 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贷盲。
9BC8889F-FC86-40EF-9321-1BB285081298.png
  • 5淘这、接著就是最關(guān)鍵的一步,在這個界面的右下角有若干選框巩剖,選中Invert Call Tree 和 Hide System Libraries,(紅圈范圍內(nèi))如果不知道在那個位置請接著往下看
5.png
  • 6铝穷、定位:在詳情面板選中顯示的若干條中的一條,雙擊佳魔,會自動跳到內(nèi)存泄露代碼處曙聂,然后點擊右上角 Xcode 圖標進行修改。
6.png

概念解釋

  • 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)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吁脱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子彬向,更是在濱河造成了極大的恐慌兼贡,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娃胆,死亡現(xiàn)場離奇詭異遍希,居然都是意外死亡,警方通過查閱死者的電腦和手機里烦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門凿蒜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胁黑,你說我怎么就攤上這事废封。” “怎么了丧蘸?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵漂洋,是天一觀的道長。 經(jīng)常有香客問我,道長刽漂,這世上最難降的妖魔是什么演训? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮贝咙,結(jié)果婚禮上仇祭,老公的妹妹穿的比我還像新娘。我一直安慰自己颈畸,他們只是感情好乌奇,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著眯娱,像睡著了一般礁苗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上徙缴,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天试伙,我揣著相機與錄音,去河邊找鬼于样。 笑死疏叨,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的穿剖。 我是一名探鬼主播蚤蔓,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼糊余!你這毒婦竟也來了秀又?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤贬芥,失蹤者是張志新(化名)和其女友劉穎吐辙,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蘸劈,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡昏苏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了威沫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贤惯。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖壹甥,靈堂內(nèi)的尸體忽然破棺而出救巷,到底是詐尸還是另有隱情壶熏,我是刑警寧澤句柠,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響溯职,放射性物質(zhì)發(fā)生泄漏精盅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一谜酒、第九天 我趴在偏房一處隱蔽的房頂上張望叹俏。 院中可真熱鬧,春花似錦僻族、人聲如沸粘驰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蝌数。三九已至,卻和暖如春度秘,著一層夾襖步出監(jiān)牢的瞬間顶伞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工剑梳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留唆貌,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓垢乙,卻偏偏與公主長得像锨咙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子追逮,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容