Instruments 2
contr + comamnd + I
Allocations
Allocation主要用于App檢測(cè)內(nèi)存分配和使用情況等
統(tǒng)計(jì)到的內(nèi)存類型有All Heap & Anonymous VM(堆內(nèi)存 和 虛擬內(nèi)存)泛粹、All Heap Allocations(堆內(nèi)存)、All Anonymous VM(虛擬內(nèi)存)
Anonymous VM(虛擬內(nèi)存)是我們無(wú)法控制的部分辨图,所以一般只關(guān)注All Heap Allocations(堆內(nèi)存)
Allocations主要包含4類統(tǒng)計(jì)項(xiàng):
- Statistics
- Call Trees
- Allocations List
- Generations
左邊面板:篩選需要記錄的Allocation践险,一般我們只勾選Created & Persistent
All Allocations:所有的
Created & Persistent:創(chuàng)建且存活的
Created & Destroyed:創(chuàng)建且被銷毀的
-
Allocation Type:記錄Allocation的類型猿妈,一般關(guān)注
AllHeapAllocations
- All Heap & Anonymous VM:所有真實(shí)內(nèi)存和虛擬內(nèi)存
- All Heap Allocations:所有真實(shí)內(nèi)存
- All VM Regions:所有分配過的虛擬內(nèi)存
Statistics 統(tǒng)計(jì)項(xiàng)
主要包含6個(gè)統(tǒng)計(jì)字段,分別對(duì)應(yīng)的含義如下
- Category:對(duì)象類型巍虫,包含Core Foundation對(duì)象彭则、OC類、內(nèi)存塊
- Persistent:當(dāng)前活躍的內(nèi)存總量
- Persistent:當(dāng)前活躍的內(nèi)存數(shù)量
- Transient:已經(jīng)釋放的內(nèi)存申請(qǐng)數(shù)
- Total Bytes:總字節(jié)數(shù)
- Total:申請(qǐng)內(nèi)存總次數(shù)
Call Trees 統(tǒng)計(jì)項(xiàng)
這個(gè)功能是將列表展示類型切換成調(diào)用樹的形式占遥,有3個(gè)統(tǒng)計(jì)項(xiàng):
- Bytes Used:相應(yīng)方法使用的內(nèi)存量
- Count:方法被調(diào)用的次數(shù)
- Symbol Name:方法名稱
對(duì)應(yīng)的在Call Trees下方還有三個(gè)配置項(xiàng)
【調(diào)用過濾】Call Tree:配置調(diào)用樹的顯示俯抖,一般勾選1、3瓦胎、4芬萍、5
- Separate by Category:按類別隔開,
勾選后
搔啊,可以更方便的看出是哪些類別的VM
- Separate by Thread:按線程劃分
- Invert Call Tree 反轉(zhuǎn)調(diào)用柬祠,通俗來說就是從上倒下跟蹤堆棧,FunA{FunB{FunC{}}} 勾選此項(xiàng)后堆棧以C->B->A 把調(diào)用層級(jí)最深的FunC顯示在最外面
- Hide System Libraries:隱藏系統(tǒng)方法,因?yàn)槟壳拔覀冎魂P(guān)心自定義的方法负芋,這個(gè)是必選的
- Flatten Recursion:遞歸函數(shù)漫蛔,每個(gè)堆棧跟蹤一個(gè)條目
- Call Tree Constraints(數(shù)據(jù)過濾):主要是對(duì)列表中的數(shù)據(jù)進(jìn)行過濾,可以設(shè)置最大/最小的數(shù)量和字節(jié)數(shù)
Data Mining:數(shù)據(jù)挖掘旧蛾,簡(jiǎn)單來說就是可以過濾掉不看的庫(kù)莽龟、符號(hào)調(diào)用,點(diǎn)擊Symbol锨天、Library會(huì)自動(dòng)把你選中的行的符號(hào)毯盈、庫(kù)加到小框中。例如選中start病袄,點(diǎn)擊symbol奶镶,就自動(dòng)過濾了start相關(guān)列
其中Symbol(符號(hào))和Library(庫(kù))有兩個(gè)選項(xiàng)迟赃,即是否過濾改行,如果點(diǎn)擊Restore會(huì)去掉小框中的選中行
Allocations List 統(tǒng)計(jì)項(xiàng)
- Adress:內(nèi)存塊的地址
- Category:對(duì)象的類型
- Timestamp:申請(qǐng)內(nèi)存的時(shí)間
- Size:內(nèi)存塊的大小
- Responsible Library:負(fù)責(zé)申請(qǐng)?jiān)搩?nèi)存的庫(kù)
- Responsible Caller:負(fù)責(zé)申請(qǐng)?jiān)搩?nèi)存的方法
Generations 統(tǒng)計(jì)項(xiàng)
在Allocation中厂镇,可以通過對(duì)每個(gè)動(dòng)作的前后進(jìn)行Mark Generation纤壁,用來對(duì)比內(nèi)存的增加,可以定位到內(nèi)存增加的具體方法和代碼所在位置捺信。其中有4列統(tǒng)計(jì)項(xiàng)
- Snapshot:快照名
- Timestamp:快照時(shí)間
- Heap Growth:自上次快照以來的增長(zhǎng)數(shù)量
- Persistent:依舊存活的對(duì)象數(shù)量
這個(gè)功能非常有用酌媒,通常用在:進(jìn)入一個(gè)頁(yè)面前mark一下,在退出這個(gè)頁(yè)面的時(shí)候再mark一下可以比較哪些內(nèi)容增加了迄靠,就可以具體分析哪些內(nèi)存沒有被釋放秒咨。具體操作如下所示
- 運(yùn)行程序,點(diǎn)擊底部Mark Generation掌挚,這樣就生成一個(gè)Generation
當(dāng)跳轉(zhuǎn)到其他頁(yè)面時(shí)雨席,再生成一個(gè)Generation
然后查看生成的Generation的Growth的大小
如果Growth太大,可以點(diǎn)進(jìn)去查看占用較大線程中的代碼塊吠式,點(diǎn)擊Generation的箭頭陡厘,進(jìn)入具體的線程
- Product - Profile - Allocation,對(duì)應(yīng)項(xiàng)目特占,運(yùn)行
從截圖中可以看出Heap為26.02MB糙置,VM是18.18MB,在程序有需要時(shí)能提供足夠的內(nèi)存空間是目,并不是現(xiàn)在創(chuàng)建的谤饭。因此手機(jī)分配給App的內(nèi)存是44.02MB。
- 選擇Generation懊纳,分析不同頁(yè)面的內(nèi)存情況揉抵,需要多個(gè)mark generation,然后選擇一個(gè)Generation嗤疯,進(jìn)入詳情分析頁(yè)面冤今,
主要關(guān)注堆內(nèi)存,所以按內(nèi)存分類身弊,并隱藏系統(tǒng)函數(shù)
從最上面可以看到堆內(nèi)存+虛擬內(nèi)存總共占了41.91MB,堆內(nèi)存占了24.89M列敲,虛擬內(nèi)存占了17.02阱佛,點(diǎn)開箭頭查看具體的函數(shù),然后點(diǎn)進(jìn)去就可以看到內(nèi)存激增的代碼了戴而,然后可以進(jìn)行相應(yīng)優(yōu)化凑术。