使用Instruments的 Allocations (al??ke??(?)n,分配)工具
Allocations 分配工具。它能給出你所有創建和存儲它們的內存的詳細信息,它也顯示你保留了每個對象的計數。
我們經常需要從服務器下載大量圖片,特別是開發照片類的應用。但往往稍不注意,內存使用就會暴增,所以得保證把這些圖片緩存下來以便重復使用。重新載入圖片時,內存都會出現使用峰值。應用先分配大量內存來替換原有圖片,然后再釋放掉這部分內存,可想而知這樣的操作效率高不了,而且如果要下載更大的文件,呃,局面大概會失控吧。用異步方式來加載圖片,這樣用不著等到所有圖片下載完才能在界面中顯示。大多數圖像緩存庫都會把加載工作放到后臺,以避免延長主線程的響應周期。
言歸正傳 步驟:
1.Xcode和選擇Product->Profile。2.然后,選擇Allocations啟動如下圖十二,圖十三,圖十四
這個時候你會發現兩個曲目。一個叫(分配)Allocations,以及一個被稱為VM Tracker(?trak?,追蹤者)(虛擬機跟蹤);虛擬機跟蹤也是非常有用的,但更復雜一點。
實際上,我們用Allocations工具也可以檢測僵尸對象,如 圖十五 所示。
我們在屬性面板中勾選”Enable NSZombie detection”,其效果和單獨使用Zombies工具是一樣的。
Instruments訪問多次運行的跟蹤數據
Instruments在一次運行期間可以記錄App的多次運行記錄。以Allocations為例,開啟Instruments后,每結束一次Allocations分析,這條分析就會被記錄下來,下次再開啟分析時,我們仍然可以看到前一次分析的信息,如圖十六所示。
通過這些記錄,我們可以對比每次分析的差別。這樣我們就可以邊修改程序,邊用Instruments來對其進行分析,并通過這種對比來觀察修改的效果 >當然,關閉Instruments時,如果不保存信息,這些記錄會被清理掉。
說到內存問題,我們更多的會想到內存泄露和野指針,而實際上還有一類看似不是問題的內存問題:Abandoned Memory(被遺棄的內存)。這類內存可能由于某些原因被分配,但并非一直需要,只是可能在程序運行期的某個時間需要,如內存緩存的圖片,還有一個比較普遍的東西–單例。我們可能會為某個模塊創建一個單例對象來維護這個模塊所需要的數據,但在退出模塊后,這個單例對象依然存在。與內存泄露不同,這些對象從技術上講依然是有效的。但實際上可能在程序后續的運行中不會再被使用。使用Instruments定位內存問題,內存泄露和野指針的定位相對來說容易些,內存泄露使用Leaks,野指針則可以使用僵尸對象。而Abandoned Memory則相對不那么明顯。Abandoned Memory可以采用所謂的Generational Analysis方法來分析,即反復進入退出某一場景,查看內存的分配與釋放情況,以定位哪些對象是屬于Abandoned Memory的范疇。在Allocations工具中,有專門的Generational Analysis設置,如下圖十七所示
我們可以在程序運行時,在進入某個模塊前標記一個Generation,這樣會生成一個快照。然后進入、退出,再標記一個Generation,如下圖十八所示。
在詳情面板中我們可以看到兩個Generation間內存的增長情況,其中就可能存在潛在的被遺棄的對象,如下圖十九所示。
定位到問題,即可做相應的優化。原文鏈接:http://www.lxweimin.com/p/c558806983cd
使用instrument測試內存泄露 工具 Allocations 測試是否內存泄露 使用標記,可以更省事省力的測試頁面是否有內存泄露
1、設置Generations
2、選擇mark generation
3、使用方法 在進入測試頁面之前,mark一下----->進入頁面----->退出----->mark------>進入------->退出------->mark------>進入如此往復5、6次,就可以看到如下結果
這種情況下是內存有泄露,看到每次的增量都是好幾百K或者上M的,都是屬于內存有泄露的,這時候就需要檢測下代碼一般情況下,100K以下都屬于正常范圍,growth表示距離你上次mark的增量