逐步解說:使用 Apple 的 Instrument 工具
本文逐步解說如何使用 Apple 的 Instruments 工具,診斷透過 Xamarin 建置的 iOS 應用程式記憶體問題。 文中將示範如何啟動 Instruments、拍攝堆積快照、分析記憶體成長。 也會示範如何使用 Instruments 顯示和鎖定造成記憶體問題的確切程式碼行數。
此頁面會示範如何使用 Xcode 的 Instruments 工具來診斷 iOS 應用程式中的記憶體問題。
診斷記憶體問題
從 Visual Studio for Mac,從 [工具啟動工具] 選單項啟動 Instruments。>
選擇 [執行 > 上傳至裝置] 功能表項,將應用程式上傳至裝置 。
選擇 [Allocations] 範本 (具有白色方塊的橘色圖示)
在視窗頂端的 [Choose a profiling template for] \(針對下列項目選擇分析範本\) 清單中,選取 Memory Demo 應用程式。 首先在 iOS 裝置上按一下,以展開顯示已安裝應用程式的功能表。
按下 [Choose] \(選擇\) 按鈕 (視窗右下方) 來啟動 Instruments。 此範本將會在上方窗格中顯示兩個項目:分別是 [Allocations] \(配置\) 和 [VM Tracker] \(VM 追蹤器\)。
按下 Instruments 中的 [Record] \(錄製\) 按鈕 (左上方的紅色圓圈),這將會啟動應用程式。
選取上方窗格中的 [VM Tracker] \(VM 追蹤器\) 列 (既然應用程式正在執行,它將會包含兩個區段:[Dirty] \(有所變更\) 和 [Resident Size] \(駐留大小\))。 在 [Inspector] \(檢查\) 窗格中,選擇 [Show Display Settings] \(顯示顯示設定\) 選項 (齒輪圖示),然後勾選 [Automatic Snapshotting] \(自動建立快照\) 核取方塊,如此螢幕擷取畫面右下方所示:
選取上方窗格中的 [Allocations] \(配置\) 列 (既然應用程式正在執行,它將會顯示 [All Heap and Anonymous VM] \(所有堆積和匿名 VM\))
在 [Inspector] \(檢查\) 窗格中,選擇 [Show Display Settings] \(顯示顯示設定\) 選項 (齒輪圖示),然後按一下 [Mark Generation] \(標示世代\) 按鈕來建立基準。 小型紅色旗標將會出現在視窗頂端的時間軸上
捲動應用程式,然後再次選取 [Mark Generation] \(標示世代\) (重複幾次)
按一下 [Stop] \(停止\) 按鈕。
展開具有最大 [Growth] \(成長\) 的 [Generation] \(世代\) 節點,並依 [Growth] \(成長\) 排序 (遞減)。
將 [Inspector] \(檢查\) 窗格變更為 [Show Extended Detail] \(顯示延伸的詳細資料\) ("E"),如此會顯示 [Stack Trace] \(堆疊追蹤\)。
請注意, <非對象> 節點會顯示過多的記憶體成長。 按一下此節點旁邊的箭號以查看更多詳細資料:在堆疊追蹤中按一下滑鼠右鍵,將 [Source Location] \(來源位置\) 新增至窗格:
依 [Size] \(大小\) 排序,並顯示 [Extended Detail] \(延伸的詳細資料\) 檢視:
按一下呼叫堆疊中所需的項目,以查看相關的程式碼:
在此案例中,將會建立新的影像,並儲存在每個儲存格的集合中,但不會重複使用現有的集合檢視儲存格。
解決記憶體問題
您可以透過 Instruments 解決這些問題,並重新執行應用程式。
透過在類別層級宣告單一執行個體,可以重複使用影像,而且可以從現有的集區重複使用儲存格物件,而不是每次都建立儲存格物件,如下所示:
public override UICollectionViewCell GetCell (UICollectionView collectionView, NSIndexPath indexPath)
{
// Dequeue a cell from the reuse pool
var imageCell = (ImageCell)collectionView.DequeueReusableCell (cellId, indexPath);
// Reuse the image declared at the class level
imageCell.ImageView.Image = image;
return imageCell;
}
現在,當應用程式執行時,就會大幅降低記憶體使用量,層代間的成長現在會以 Kib (KB) (而不是 MiB (MB)) 測量,因為這是在修正程式碼之前:
Xamarin.iOS 垃圾收集一文是處理 Xamarin.iOS 記憶體問題的實用參考。
摘要
本文示範如何使用 Instruments 來診斷記憶體問題。 它說明如何從 Visual Studio for Mac 內啟動 Instruments、載入記憶體配置範本,並逐步使用快照鎖定記憶體問題。 最後,應用程式會經過重新檢查以確認問題已獲得修正。