分析內存使用情況 (JavaScript)
[此文檔是初定版,隨時可能進行更改。]
-
通過強調最相關的數據幫助你在應用程序中快速查找內存使用情況問題。 你將以快照摘要形式收到此數據,其顯示兩個快照之間的差異,并提供指向更詳細視圖的鏈接。 -
提供控制器、類型和根的視圖來幫助隔離問題。 -
減少 JavaScript 堆數據中的不可操作的信息。 不是直接在應用程序代碼中創建的對象將被自動篩選出來。 還可按對象名稱篩選數據。
運行 JavaScript 內存分析器
檢查內存使用量
隔離內存泄漏
查看實時內存使用量摘要
查看快照摘要
查看快照詳細信息
查看快照差異
在對象樹中查找對象
篩選數據
查看共享對象引用
顯示內置對象
保存診斷會話文件
將源代碼與內存使用量數據關聯
確定內存問題的提示
運行內存分析器
-
打開 Visual Studio。 -
Standard toolbar, choose Local Machine, Simulator, or Remote Machine." data-guid="47e079b68249fc5aebb6072418787081">
如果從 Visual Studio 中運行應用程序,請在“標準”工具欄上的“啟動調試”列表中,選擇“本地計算機”、“模擬器”或“遠程計算機”。 有關這些選項的更多信息,請參見從 Visual Studio 運行 Windows 應用商店應用程序。 -
在菜單欄上,選擇“調試”和“性能和診斷”。 默認情況下,將分析當前啟動項目。 如果要更改分析目標,請選擇“更改目標”。 以下選項可用于分析目標: -
“啟動項目”。 分析當前啟動項目。 如果你要在遠程計算機上運行應用程序,則必須選擇此選項,這是默認值。 -
“正在運行的應用程序”。 允許你從正在運行的應用程序的列表中選擇應用程序。 在遠程計算機上運行應用程序時,不能使用此選項。 當你無權訪問源代碼時,請使用此選項分析計算機上運行的應用程序的內存使用量。 -
“已安裝的應用程序”。 允許你選擇要分析的已安裝應用程序。 在遠程計算機上運行應用程序時,不能使用此選項。 當你無權訪問源代碼時,請使用此選項分析計算機上安裝的應用程序的內存使用量。 如果要分析你自己的應用程序開發之外的任何應用程序的內存使用量,此選項也很有用。
-
-
從“可用工具”中,選中“JavaScript 內存”復選框,然后選擇“啟動”。 -
啟動內存分析器時,可能會顯示一個“用戶帳戶控制”窗口,要求你提供運行 Visual Studio ETW Collector.exe 的權限。 選擇“是”。 與應用程序交互以測試相關的內存使用量方案并查看內存關系圖,如以下各節所述。 -
按 Alt+Tab 切換到 Visual Studio。
-
實時內存使用量摘要 。 使用內存使用量圖來查找內存使用量的突然增長或由特定操作導致的連續增長的內存使用量。 使用實時內存使用量摘要視圖來拍攝堆的快照,這些快照在內存使用量圖中顯示為一個集合。 -
快照摘要 。 可以在內存分析會話期間或之后查看快照摘要信息。 使用快照摘要可鏈接到快照詳細信息和快照差異視圖。 通常,快照差異視圖將提供有關內存泄漏的最有用的信息。 -
快照詳細信息 。 顯示單個快照的詳細內存使用量數據。 -
快照差異 。 顯示快照之間的差異值。 這些視圖將顯示對象大小和對象計數方面的差異。
-
在 Visual Studio 中打開應用程序。 -
運行 JavaScript 內存分析器。 有關更多信息,請參見運行 JavaScript 內存分析器。 -
如果有可能,請將你的應用程序置于遭遇內存泄漏之前的狀態。 例如,這可能是在大型 DOM 剛要轉變之前、加載特定頁時或啟動應用程序時。 -
切換到 Visual Studio(按 Alt+Tab)。 -
通過選擇“拍攝堆快照”拍攝基線堆快照。 下圖演示了一個基線堆快照示例: 若要對快照計時進行更精確的控制,請在代碼中使用 console.takeHeapSnapshot 命令。 -
切換到你的應用程序并進行一些你懷疑可能導致內存泄漏的操作。 如果只是測試內存使用量而不是處理懷疑的內存泄漏,請參見檢查內存使用量。 -
切換到 Visual Studio 并拍攝第二個快照。 -
切換到你的應用程序并重復你懷疑的導致內存泄漏的操作。 -
切換到 Visual Studio 并拍攝第三個快照。 下圖演示了第二個和第三個快照的示例: 通過拍攝此工作流中的第三個快照,可以篩選出與內存泄漏不相關的、從基線快照到第二個快照的更改。 例如,預計可能有一些更改(如在頁面上更新頁眉和頁腳)會造成內存使用量的更改,但可能與內存泄漏不相關。 -
使用內存使用量視圖,調查從第二個快照到第三個快照在堆大小和對象計數方面的差異。 下面是一些提示: -
如果可能,請嘗試進一步隔離發生內存泄漏的期間,然后重新拍攝第三個快照。 若要進一步隔離內存泄漏,請使用 console.takeHeapSnapshot、用戶標記以及分析器中提供的其他內存使用量數據。 -
若要查看差異視圖中的對象植根于全局對象中的位置,以防止將其作為垃圾回收,請打開對象的快捷菜單,然后選擇“在根視圖中顯示”。

Associate source code with memory usage data), an inverted triangle appears in the memory usage graph to indicate when that section of code is reached. " data-guid="809a68e01a7d2b1635f07a95d27145d6">

-
快照標題和時間戳。 -
潛在問題計數(用藍色信息圖標標記)。 此數字(如果存在)標識潛在內存問題(例如,節點未附加到 DOM)的數目。 此計數將鏈接到快照的控制器視圖,此視圖按照問題類型進行排序以突出顯示潛在問題。 工具提示中將顯示問題的說明。 -
堆大小。 此數量包括由 JavaScript 運行時引擎添加到 JavaScript 堆的 DOM 元素和對象。 堆大小將鏈接到快照的控制器視圖。 -
堆大小差異。 此值顯示當前快照的堆大小和前一個快照的堆大小之間的差異。 如果內存增加,則該值后跟一個紅色向上箭頭;如果內存減少,則該值后跟一個綠色向下箭頭。 如果快照間的堆大小未發生更改,則將顯示文本“無更改”而不是數字。 對于第一個快照,將顯示文本“基線”。 堆大小差異將鏈接到快照差異的控制器視圖。 -
對象計數。 此計數僅顯示在應用程序中創建的對象,并篩選出由 JavaScript 運行時創建的內置對象。 對象計數鏈接到快照詳細信息的類型視圖。 -
對象計數差異。 這將顯示兩個值:第一個值是自前一個快照以來添加的新對象的數量;第二個值是自前一個快照以來移除的對象的數量。 例如,+25 / -10 表示添加了 25 個對象,并移除了 10 個對象。 如果對象總計數增加,則此信息后面會跟一個紅色向上箭頭;如果對象總計數減少,則此信息后面將跟一個綠色向下箭頭。 如果對象計數未發生更改,則將顯示文本“無更改”而不是數字。 對于第一個快照,將顯示文本“基線”。 對象計數差異鏈接到快照差異的類型視圖。 -
在拍攝快照時屏幕的快照。

-
支配者。 顯示堆中所有對象的列表,按保留大小排序。 如果你從快照摘要中的潛在問題鏈接打開此視圖,則將按問題類型對對象進行排序以突出顯示潛在問題。 工具提示提供每個問題的說明。 控制器的差異視圖可以幫助快速確定使用最多內存的對象。 -
類型。 顯示對象的實例計數和總大小,按對象類型分組。 默認情況下,它們按實例計數排序。 -
根。 顯示從根對象到子引用的對象的分層視圖。 默認情況下,子節點按保留的大小列排序,最大的排在頂部。
-
標識符。 最能標識對象的名稱。 例如,對于 HTML 元素,快照詳細信息顯示 ID 特性值(如果使用)。 -
類型。 對象類型(例如,HTML 鏈接元素或 div 元素)。 -
大小。 對象大小,不包括任何引用對象的大小。 -
保留的大小。 對象大小加上所有沒有其他父對象的子對象的大小。 從實用的角度而言,這是對象保留的內存量,因此,如果你刪除對象,則將回收指定的內存量。 -
計數。 對象實例的數量。 此值僅顯示在類型視圖中。

-
“操作”。 顯示當前快照中的對象和前一個快照中的對象之間的更改類型。 可能的值包括: -
“已添加”。 自前一個快照以來添加的對象使用綠色進行彩色編碼。 -
“已修改”。 自前一個快照以來修改的對象使用藍色進行彩色編碼。 -
“未更改”。 自前一個快照以來未更改的對象顯示“未更改”或空白值。 未更改的對象不會泄漏內存。 -
“未更改 [基線]”。 未從基線快照更改的對象顯示此值。 這些對象不會泄漏內存。
-
-
大小差異。 當前快照中對象的大小及其在之前的快照中的大小之間的差異,不包括任何引用對象的大小。 -
保留的大小差異。 當前快照中對象的保留的大小及其在上一個快照中的保留的大小之間的差異。 保留的大小包括對象大小加上其所有沒有其他父對象的子對象的大小。 從實用的角度而言,保留大小是對象保留的內存量,因此,如果你刪除對象,則你回收指定的內存量。 -
計數差異。 當前快照中的對象實例數和上一個快照中的對象實例數之間的差異。 此值僅顯示在類型視圖中。

-
console.takeHeapSnapshot 采用出現在 JavaScript 內存分析器中的堆快照。 此命令是 JavaScript 控制臺命令之一。 -
performance.mark 設置一個用戶標記(倒三角形),該標記在應用程序運行時顯示在摘要視圖中的內存關系圖的時間線上。 此命令采用一個描述事件并且在內存關系圖中顯示為工具提示的字符串參數。 此說明不能超過 100 個字符。
if (console && console.takeHeapSnapshot) {
console.takeHeapSnapshot();
}
if (performance && performance.mark) { performance.mark("message_string"); }

-
按照隔離內存泄漏中描述的工作流操作。 -
使用快照差異的控制器視圖可幫助快速確定主要內存問題。 -
使用在根視圖中顯示可查看在內存層次結構中引用對象的位置。 -
當內存問題的原因時難以確定時,應使用各種視圖(例如控制器和類型)查找共性,例如大小和對象計數不斷增長的關聯的對象和類型。 -
考慮臨時修改代碼來隔離問題。 例如,你可能希望: -
對內存分析器使用 console.takeSnapshot 和 performance.mark 命令。(請參見將源代碼與內存使用量數據關聯。) 可以使用這兩條命令來幫助隔離無法通過手動拍攝堆快照進行隔離的問題。 -
創建一個測試對象,并在 JavaScript 內存分析器視圖(如控制器視圖)中跟蹤該對象。 例如,可以將一個極大對象附加到另一個對象以查明特定對象或組件是否已進行垃圾回收。
-
-
在用戶導航到新頁后,查找無意間保留在內存中的對象,這是導致出現內存問題的一個常見原因。 例如,URL.CreateObjectUrl 函數的使用不當可能導致此問題。
from:http://msdn.microsoft.com/zh-cn/library/windows/apps/jj819176.aspx
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成