練習 1.3:分析洩漏候選項
開始之前,您必須先完成練習 1.2:擷取資料堆傾出。
在這個練習中,首先將會產生明顯有洩漏現象的物件清單(例如,陣列、向量和階段作業)。這些稱為「洩漏候選項」。然後將會分析這份清單來找出任何的洩漏。
產生洩漏候選項清單
若要產生清單:
- 遵循「洩漏候選項」視圖中的指示,按一下「分析洩漏」工具列按鈕
。這時會開啟「選取分析洩漏選項」對話框。
- 在對話框中,請確定已勾選您的兩個資料堆傾出的勾選框。
附註:「臨界值」預設為 20。這表示只會顯示「可能性」的值為 20 的洩漏候選項。(這個練習的稍後會提供關於「可能性」值的詳細資訊。)
- 按一下確定來產生清單。Software Development Platform 右下角的指示器會表示正在尋找洩漏候選項。
「洩漏候選項」視圖的概觀
當處理程序完成時,「洩漏候選項」視圖會顯示洩漏候選項清單。
每一個候選項都具有 1 到 100 之間的可能性值,最可能的候選項其值為 100。其他的候選項則會區分等級,依照可能性降冪次序列示出來。(資料堆比較演算法根據洩漏大小以及兩個資料堆傾出之間間隔的資料堆成長量來計算可能性值。)
這個側寫執行的「臨界值」設為 20;「可能性」值為 19 或更低的任何候選項將不會顯示。
視圖會提供每個洩漏候選項的下列資料:
- 洩漏的根。這是保存潛在洩漏物件參照的最上層根物件。
- 儲存器類型。這是保存洩漏物件的集合物件。洩漏最可能發生在集合物件,例如向量和列示。
- 洩漏的項目。這是洩漏物件的類型。
- 洩漏數目。這個值代表儲存器物件中的「洩漏的項目」直欄所指定之物件類型的數目。這些物件可能還會參照其他物件。「洩漏的物件」和「洩漏的位元組」直欄包括這些被參照的物件。
- 洩漏的位元組。
- 洩漏的物件。
分析及識別洩漏
若要識別洩漏:
- 在「洩漏候選項」視圖中,查看可能性為 100 的洩漏候選項資料:
- 洩漏的根是 TestThreeTierQueue.<ObjectID>
- 儲存器類型是 vector。
- 向量是洩漏字串。換句話說,向量是保存應該要釋放的字串參照(由洩漏數和洩漏位元組數來判斷),以便讓記憶體回收能夠釋放記憶體。(每次執行這個程式時,洩漏數和洩漏位元組數可能會不同,視擷取的資料堆傾出時間點而定。)
- 按兩下洩漏候選項。這時會開啟「物件參照圖形」視圖,並顯示洩漏候選項的圖形資料。(請注意,可能需要一點時間來準備要顯示的資料堆傾出。)
- 檢查物件參照圖形。請注意下列事項:
- 圖形強調顯示有洩漏可能的(依參照)連接的物件:洩漏的根、向下經過 SecondaryQueue、到達向量,最後到洩漏的字串集。這提供洩漏項目的視覺化影像。
- 在圖形中,有一個由 Vector 參照的 Object 陣列(與洩漏有關的儲存器類型),Object 陣列參照洩漏的 String 物件。
- 將游標暫停在連接 Object 陣列和 String 的路徑之上,然後閱讀顯示的工具要訣:它顯示「計數」等於「洩漏候選項」視圖中的「洩漏數」,所以這是定義為洩漏的字串的集合。
- 在物件參照圖形中,按兩下 String 物件。這時會開啟「物件詳細資料」視圖。其中會顯示 String 物件的所有詳細資料,包括參照它的所有物件,以及它參照的所有物件。請注意,在「物件詳細資料」視圖中,您可以按一下其中的一個物件來透過參照者向上導覽,或透過被參照者(該物件參照的物件)向下導覽。
您發現什麼狀況?您現在知道第二個佇列是洩漏物件,而且知道是因為 Vector 物件保留太多 String 物件的參照而發生洩漏。
現在您已準備好開始進行練習 1.4:修正記憶體洩漏。