Xcode Instruments是用于動(dòng)態(tài)調(diào)追蹤和分析OS X和iOS的代碼的性能分析和測(cè)試工具堕扶;
打開(kāi)方式:
Xcode -> Open Developer Tool -> Instruments
其中比較常用的:
·Leaks:一般的查看內(nèi)存使用情況,檢查泄漏的內(nèi)存搭幻,并提供了所有活動(dòng)的分配和泄漏模塊的類(lèi)對(duì)象分配統(tǒng)計(jì)·信息以及內(nèi)存地址歷史記錄
·Time Profiler:分析代碼的執(zhí)行時(shí)間,執(zhí)行對(duì)系統(tǒng)的CPU上運(yùn)行的進(jìn)程低負(fù)載時(shí)間為基礎(chǔ)采樣
其他的:
·Blank:創(chuàng)建一個(gè)空的模板,可以從Library庫(kù)中添加其他模板
·Allocations:用來(lái)檢查內(nèi)存分配,跟蹤過(guò)程的匿名虛擬內(nèi)存和堆的對(duì)象提供類(lèi)名和可選保留/釋放歷史
·Activity Monitor:顯示器處理的CPU大咱、內(nèi)存和網(wǎng)絡(luò)使用情況統(tǒng)計(jì)
·Automation:用JavaScript語(yǔ)言編寫(xiě),主要用于分析應(yīng)用的性能和用戶(hù)行為注益,模仿/擊發(fā)被請(qǐng)求的事件碴巾,利用它可以完成對(duì)被測(cè)應(yīng)用的簡(jiǎn)單的UI測(cè)試及相關(guān)功能測(cè)試
·Cocoa Layout:觀察約束變化,找出布局代碼的問(wèn)題所在聊浅。
·Core Animation:用來(lái)檢測(cè)Core Animation性能的餐抢,給我們提供了周期性的FPS,并且考慮到了發(fā)生在程序之外的動(dòng)畫(huà)低匙,界面滑動(dòng)FPS可以進(jìn)行測(cè)試
·Core Data:監(jiān)測(cè)讀取旷痕、緩存未命中、保存等操作顽冶,能直觀顯示是否保存次數(shù)遠(yuǎn)超實(shí)際需要
·Energy Diagnostic :用于Xcode下的Instruments來(lái)分析手機(jī)電量消耗的欺抗。(必須是真機(jī)才有電量)
·GPU Driver :可以測(cè)量GPU的利用率,同樣也是一個(gè)很好的來(lái)判斷和GPU相關(guān)動(dòng)畫(huà)性能的指示器强重。它同樣也提供了類(lèi)似Core Animtaion那樣顯示FPS的工具绞呈。
·Network:分析應(yīng)用程序如何使用TCP / IP和UDP / IP連接使用連接儀器。就是檢查手機(jī)網(wǎng)速的间景。(這個(gè)最好是真機(jī))
·Zombies:檢查是否訪問(wèn)了僵尸對(duì)象
一佃声、Leaks(泄漏)
1.內(nèi)存溢出和內(nèi)存泄漏的區(qū)別
內(nèi)存溢出 out of memory,是指程序在申請(qǐng)內(nèi)存時(shí)倘要,沒(méi)有足夠的內(nèi)存空間供其使用圾亏,出現(xiàn)out of memory;比如申請(qǐng)了一個(gè)integer,但給它存了long才能存下的數(shù)封拧,那就是內(nèi)存溢出志鹃。
內(nèi)存泄露 memory leak,是指程序在申請(qǐng)內(nèi)存后泽西,無(wú)法釋放已申請(qǐng)的內(nèi)存空間曹铃,一次內(nèi)存泄露危害可以忽略,但內(nèi)存泄露堆積后果很?chē)?yán)重捧杉,無(wú)論多少內(nèi)存,遲早會(huì)被占光陕见。
memory leak會(huì)最終會(huì)導(dǎo)致out of memory!
在前面的ALLcations里面我們提到過(guò)內(nèi)存泄漏就是應(yīng)該釋放而沒(méi)有釋放的內(nèi)存糠溜。而內(nèi)存泄漏分為兩種:Leaked Memory 和 Abandoned Memory淳玩。前面我們講到了如何找到Abandoned Memory被遺忘的內(nèi)存,現(xiàn)在我們研究的就是Leaked Memory非竿。
以發(fā)生的方式來(lái)分類(lèi)蜕着,內(nèi)存泄漏可以分為4類(lèi):
1.常發(fā)性?xún)?nèi)存泄漏:發(fā)生內(nèi)存泄漏的代碼會(huì)被多次執(zhí)行到,每次被執(zhí)行的時(shí)候都會(huì)導(dǎo)致一塊內(nèi)存泄漏。
2.偶發(fā)性?xún)?nèi)存泄漏:發(fā)生內(nèi)存泄漏的代碼只有在某些特定環(huán)境或操作過(guò)程下才會(huì)發(fā)生承匣。常發(fā)性和偶發(fā)性是相對(duì)的蓖乘。對(duì)于特定的環(huán)境,偶發(fā)性的也許就變成了常發(fā)性的韧骗。所以測(cè)試環(huán)境和測(cè)試方法對(duì)檢測(cè)內(nèi)存泄漏至關(guān)重要嘉抒。
3.一次性?xún)?nèi)存泄漏:發(fā)生內(nèi)存泄漏的代碼只會(huì)被執(zhí)行一次,或者由于算法上的缺陷袍暴,導(dǎo)致總會(huì)有一塊僅且一塊內(nèi)存發(fā)生泄漏些侍。比如,在類(lèi)的構(gòu)造函數(shù)中分配內(nèi)存政模,在析構(gòu)函數(shù)中卻沒(méi)有釋放該內(nèi)存岗宣,所以?xún)?nèi)存泄漏只會(huì)發(fā)生一次。
4.隱式內(nèi)存泄漏:程序在運(yùn)行過(guò)程中不停的分配內(nèi)存淋样,但是直到結(jié)束的時(shí)候才釋放內(nèi)存耗式。嚴(yán)格的說(shuō)這里并沒(méi)有發(fā)生內(nèi)存泄漏,因?yàn)樽罱K程序釋放了所有申請(qǐng)的內(nèi)存趁猴。但是對(duì)于一個(gè)服務(wù)器程序刊咳,需要運(yùn)行幾天,幾周甚至幾個(gè)月儡司,不及時(shí)釋放內(nèi)存也可能導(dǎo)致最終耗盡系統(tǒng)的所有內(nèi)存娱挨。所以,我們稱(chēng)這類(lèi)內(nèi)存泄漏為隱式內(nèi)存泄漏捕犬。
也可以通過(guò)以下方式打開(kāi)
有泄漏時(shí)長(zhǎng)這樣
這樣設(shè)置
然后就可以通過(guò)雙擊到相對(duì)于的代碼中啦
二让蕾、Time Profiler(時(shí)間分析器)
檢測(cè)app中每個(gè)方法所用的時(shí)間,可以進(jìn)行排序或听、查找出占用了大量時(shí)間的函數(shù)。
使用Time Profile前有兩點(diǎn)需要注意的地方:
1笋婿、一定要使用真機(jī)調(diào)試
因?yàn)槟M器運(yùn)行在Mac上誉裆,Mac上的GPU和iOS設(shè)備的完全不一樣,模擬器不得已要在軟件層面(CPU)模擬設(shè)備的GPU缸濒,這意味著GPU相關(guān)的操作在模擬器上運(yùn)行的更慢足丢,尤其是使用CAEAGLLayer來(lái)寫(xiě)一些OpenGL的代碼時(shí)候,這就導(dǎo)致模擬器性能數(shù)據(jù)和用戶(hù)真機(jī)使用性能數(shù)據(jù)相去甚遠(yuǎn)庇配。
2斩跌、應(yīng)用程序一定要使用發(fā)布配置
在發(fā)布環(huán)境打包的時(shí)候,編譯器會(huì)引入一系列提高性能的優(yōu)化捞慌,例如去掉調(diào)試符號(hào)或者移除并重新組織代碼耀鸦。另iOS引入一種"Watch Dog"[看門(mén)狗]機(jī)制,不同的場(chǎng)景下,“看門(mén)狗”會(huì)監(jiān)測(cè)應(yīng)用的性能袖订,如果超出了該場(chǎng)景所規(guī)定的運(yùn)行時(shí)間氮帐,“看門(mén)狗”就會(huì)強(qiáng)制終結(jié)這個(gè)應(yīng)用的進(jìn)程。開(kāi)發(fā)者可以crashlog看到對(duì)應(yīng)的日志洛姑,但Xcode在調(diào)試配置下會(huì)禁用"Watch Dog"上沐。
運(yùn)行你的程序,并打開(kāi) Time Profiler
里面便是一個(gè)個(gè)函數(shù)名楞艾,點(diǎn)擊便可進(jìn)入