<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    分析內存使用情況 (JavaScript)

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    [此文檔是初定版,隨時可能進行更改。]

    JavaScript 內存分析器在 Visual Studio 2012 更新 1 和 Visual Studio 2013 中提供,旨在幫助你了解內存使用量和查找使用 JavaScript 為 Windows 生成的 Windows 應用商店應用程序中的內存泄漏。

    JavaScript 內存分析器可以為你執行以下操作:

    • 通過強調最相關的數據幫助你在應用程序中快速查找內存使用情況問題。

      你將以快照摘要形式收到此數據,其顯示兩個快照之間的差異,并提供指向更詳細視圖的鏈接。

    • 提供控制器、類型和根的視圖來幫助隔離問題。

    • 減少 JavaScript 堆數據中的不可操作的信息。

      不是直接在應用程序代碼中創建的對象將被自動篩選出來。 還可按對象名稱篩選數據。

    在本主題中:

    運行 JavaScript 內存分析器
    檢查內存使用量
    隔離內存泄漏
    查看實時內存使用量摘要
    查看快照摘要
    查看快照詳細信息
    查看快照差異
    在對象樹中查找對象
    篩選數據
    查看共享對象引用
    顯示內置對象
    保存診斷會話文件
    將源代碼與內存使用量數據關聯
    確定內存問題的提示

    運行 JavaScript 內存分析器

    如果工作的 Windows 應用商店應用程序在 Visual Studio 中打開或安裝在運行 Windows 8 或 Windows 8.1 預覽版 的計算機上,則可使用內存分析器。

    運行內存分析器

    1. 打開 Visual Studio。

    2. Standard toolbar, choose Local Machine, Simulator, or Remote Machine." data-guid="47e079b68249fc5aebb6072418787081">如果從 Visual Studio 中運行應用程序,請在“標準”工具欄上的“啟動調試”列表中,選擇“本地計算機”“模擬器”“遠程計算機”

      有關這些選項的更多信息,請參見從 Visual Studio 運行 Windows 應用商店應用程序

    3. 在菜單欄上,選擇“調試”“性能和診斷”

      默認情況下,將分析當前啟動項目。 如果要更改分析目標,請選擇“更改目標”

      以下選項可用于分析目標:

      • “啟動項目” 分析當前啟動項目。 如果你要在遠程計算機上運行應用程序,則必須選擇此選項,這是默認值。

      • “正在運行的應用程序” 允許你從正在運行的應用程序的列表中選擇應用程序。 在遠程計算機上運行應用程序時,不能使用此選項。

        當你無權訪問源代碼時,請使用此選項分析計算機上運行的應用程序的內存使用量。

      • “已安裝的應用程序” 允許你選擇要分析的已安裝應用程序。 在遠程計算機上運行應用程序時,不能使用此選項。

        當你無權訪問源代碼時,請使用此選項分析計算機上安裝的應用程序的內存使用量。 如果要分析你自己的應用程序開發之外的任何應用程序的內存使用量,此選項也很有用。

    4. “可用工具”中,選中“JavaScript 內存”復選框,然后選擇“啟動”

    5. 啟動內存分析器時,可能會顯示一個“用戶帳戶控制”窗口,要求你提供運行 Visual Studio ETW Collector.exe 的權限。 選擇“是”

      與應用程序交互以測試相關的內存使用量方案并查看內存關系圖,如以下各節所述。

    6. 按 Alt+Tab 切換到 Visual Studio。

    若要查看內存分析器正在收集的數據,請選擇“拍攝堆快照” 請參見本主題后面的查看快照摘要

    檢查內存使用量

    可以嘗試通過在 JavaScript 內存分析器使用不同的視圖來確定內存泄漏。 如果已懷疑你的應用程序正在泄漏內存,請查看隔離內存泄漏中建議的工作流。

    使用以下視圖來幫助確定應用程序中的內存泄漏:

    • 實時內存使用量摘要  使用內存使用量圖來查找內存使用量的突然增長或由特定操作導致的連續增長的內存使用量。 使用實時內存使用量摘要視圖來拍攝堆的快照,這些快照在內存使用量圖中顯示為一個集合。

    • 快照摘要  可以在內存分析會話期間或之后查看快照摘要信息。 使用快照摘要可鏈接到快照詳細信息和快照差異視圖。

      提示 提示

      通常,快照差異視圖將提供有關內存泄漏的最有用的信息。

    • 快照詳細信息  顯示單個快照的詳細內存使用量數據。

    • 快照差異  顯示快照之間的差異值。 這些視圖將顯示對象大小和對象計數方面的差異。

    隔離內存泄漏

    以下是可幫助你更有效地使用 JavaScript 內存分析器的工作流步驟。 如果你懷疑你的應用程序有內存泄漏,這些步驟將非常有用。

    1. 在 Visual Studio 中打開應用程序。

    2. 運行 JavaScript 內存分析器。 有關更多信息,請參見運行 JavaScript 內存分析器

    3. 如果有可能,請將你的應用程序置于遭遇內存泄漏之前的狀態。 例如,這可能是在大型 DOM 剛要轉變之前、加載特定頁時或啟動應用程序時。

    4. 切換到 Visual Studio(按 Alt+Tab)。

    5. 通過選擇“拍攝堆快照”拍攝基線堆快照。

      下圖演示了一個基線堆快照示例:

      提示 提示

      若要對快照計時進行更精確的控制,請在代碼中使用 console.takeHeapSnapshot 命令。

    6. 切換到你的應用程序并進行一些你懷疑可能導致內存泄漏的操作。

      如果只是測試內存使用量而不是處理懷疑的內存泄漏,請參見檢查內存使用量

    7. 切換到 Visual Studio 并拍攝第二個快照。

    8. 切換到你的應用程序并重復你懷疑的導致內存泄漏的操作。

    9. 切換到 Visual Studio 并拍攝第三個快照。

      下圖演示了第二個和第三個快照的示例:

      通過拍攝此工作流中的第三個快照,可以篩選出與內存泄漏不相關的、從基線快照到第二個快照的更改。 例如,預計可能有一些更改(如在頁面上更新頁眉和頁腳)會造成內存使用量的更改,但可能與內存泄漏不相關。

    10. 使用內存使用量視圖,調查從第二個快照到第三個快照在堆大小和對象計數方面的差異。 下面是一些提示:

      • 檢查潛在問題(快照摘要中用藍色信息圖標標記)。

      • 檢查對象堆大小和對象計數的差異視圖(帶有紅色箭頭和綠色箭頭的鏈接)。 差異視圖使用彩色編碼來突出顯示從前一個快照更改的項。 藍色指示已修改的元素或對象。 綠色表示已添加的元素或對象。

        提示 提示

        如果某個項是未修改的(黑色),則不泄漏內存。 只有已添加或已修改的項表示潛在的內存泄漏。

      • 檢查控制器的差異視圖來快速確定使用最多內存的對象。

      • 使用這些視圖可根據應用程序的已知行為來查找意外的對象大小或對象計數方面的較大變化。

    11. 如果可能,請嘗試進一步隔離發生內存泄漏的期間,然后重新拍攝第三個快照。 若要進一步隔離內存泄漏,請使用 console.takeHeapSnapshot用戶標記以及分析器中提供的其他內存使用量數據。

    12. 若要查看差異視圖中的對象植根于全局對象中的位置,以防止將其作為垃圾回收,請打開對象的快捷菜單,然后選擇“在根視圖中顯示”

    查看實時內存使用量摘要

    實時內存使用量摘要視圖提供了正在運行的應用程序的內存使用量圖,以及所有快照摘要圖塊的集合。 在此視圖中,可以執行拍攝快照、分析摘要信息和導航到其他視圖等基本任務。 停止收集數據后,內存關系圖將消失,你只能看到快照摘要視圖。

    內存關系圖顯示應用程序進程內存的活動視圖,包括專用字節、本機內存和 JavaScript 堆。 內存關系圖是進程內存的可滾動視圖。 該窗口類似于下方所示:

    JavaScript 內存分析器內存圖

    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">如果你已向應用程序代碼中添加用戶標記(請參見將源代碼與內存使用量數據關聯),則內存使用量圖中將出現一個倒三角形,用于指示何時到達該代碼部分。

    內存關系圖中顯示的一些內存是由 JavaScript 運行時分配的。 你無法在應用程序中控制此內存使用量。 當你拍攝第一個快照時,關系圖中顯示的內存使用量會增加,之后該使用量會對每個附加的快照按最低限度增加。

    查看快照摘要

    若要拍攝應用程序內存使用量的當前狀態的快照,請從內存關系圖中選擇“拍攝堆快照” 快照摘要圖塊會同時出現在實時內存使用量摘要(在應用程序運行時)和快照摘要(在應用程序停止時)中,它提供了有關 JavaScript 堆的信息和指向更詳細的信息的鏈接。 如果拍攝了兩個或更多快照,則快照將提供更多信息以將其數據與前一個快照的數據進行比較。

    說明 說明

    JavaScript 內存分析器會在拍攝每個快照之前強制進行垃圾回收。 這有助于確保各個運行中的結果更加一致。

    以下是你拍攝多個快照時的快照摘要的示例。

    屏幕快照摘要

    快照摘要包括:

    • 快照標題和時間戳。

    • 潛在問題計數(用藍色信息圖標標記)。 此數字(如果存在)標識潛在內存問題(例如,節點未附加到 DOM)的數目。 此計數將鏈接到快照的控制器視圖,此視圖按照問題類型進行排序以突出顯示潛在問題。工具提示中將顯示問題的說明。

    • 堆大小。 此數量包括由 JavaScript 運行時引擎添加到 JavaScript 堆的 DOM 元素和對象。 堆大小將鏈接到快照的控制器視圖。

    • 堆大小差異。 此值顯示當前快照的堆大小和前一個快照的堆大小之間的差異。 如果內存增加,則該值后跟一個紅色向上箭頭;如果內存減少,則該值后跟一個綠色向下箭頭。 如果快照間的堆大小未發生更改,則將顯示文本“無更改”而不是數字。 對于第一個快照,將顯示文本“基線” 堆大小差異將鏈接到快照差異的控制器視圖。

    • 對象計數。 此計數僅顯示在應用程序中創建的對象,并篩選出由 JavaScript 運行時創建的內置對象。 對象計數鏈接到快照詳細信息的類型視圖。

    • 對象計數差異。 這將顯示兩個值:第一個值是自前一個快照以來添加的新對象的數量;第二個值是自前一個快照以來移除的對象的數量。 例如,+25 / -10 表示添加了 25 個對象,并移除了 10 個對象。 如果對象總計數增加,則此信息后面會跟一個紅色向上箭頭;如果對象總計數減少,則此信息后面將跟一個綠色向下箭頭。 如果對象計數未發生更改,則將顯示文本“無更改”而不是數字。 對于第一個快照,將顯示文本“基線” 對象計數差異鏈接到快照差異的類型視圖。

    • 在拍攝快照時屏幕的快照。

    提示 提示

    快照摘要可能顯示堆大小或對象計數無更改或減少,但仍可能隱藏內存泄漏。 當新創建的對象的數量或大小小于已刪除對象(例如,作為垃圾回收的結果)的數量或大小時,可能會出現此情況。

    查看快照詳細信息

    可以在快照詳細信息視圖中查看有關每個快照的內存使用量的詳細信息。

    從快照摘要視圖中,選擇一個鏈接來查看快照詳細信息。 例如,默認情況下,堆大小鏈接將在控制器視圖打開的情況下打開快照詳細信息。

    此圖顯示了快照詳細信息的控制器視圖,以及按問題類型排序的內存使用量數據,并突出顯示了潛在問題。

    Snapshot details view showing potential issues

    在快照詳細信息視圖中,你可以通過從工具欄中選擇相應的選項來按控制器、類型或根查看內存使用量數據:

    • 支配者 顯示堆中所有對象的列表,按保留大小排序。 如果你從快照摘要中的潛在問題鏈接打開此視圖,則將按問題類型對對象進行排序以突出顯示潛在問題。 工具提示提供每個問題的說明。

      提示 提示

      控制器的差異視圖可以幫助快速確定使用最多內存的對象。

    • 類型 顯示對象的實例計數和總大小,按對象類型分組。 默認情況下,它們按實例計數排序。

    •  顯示從根對象到子引用的對象的分層視圖。 默認情況下,子節點按保留的大小列排序,最大的排在頂部。

    所有三個視圖都顯示了類似的值類型,包括:

    • 標識符 最能標識對象的名稱。 例如,對于 HTML 元素,快照詳細信息顯示 ID 特性值(如果使用)。

    • 類型 對象類型(例如,HTML 鏈接元素或 div 元素)。

    • 大小 對象大小,不包括任何引用對象的大小。

    • 保留的大小 對象大小加上所有沒有其他父對象的子對象的大小。 從實用的角度而言,這是對象保留的內存量,因此,如果你刪除對象,則將回收指定的內存量。

    • 計數 對象實例的數量。 此值僅顯示在類型視圖中。

    查看快照差異

    在 JavaScript 內存分析器中,可以在快照差異視圖中將一個快照與前一個快照進行比較。

    在快照摘要視圖中,如果拍攝了兩個或更多快照,則可以通過選擇差異堆大小或差異對象計數鏈接來查看差異快照的詳細信息。

    可以查看有關控制器、類型和根的差異信息。 快照差異顯示添加到兩個快照之間的堆中的任何對象。

    此圖顯示快照差異中的類型視圖。

    Snapshot diff view showing types

    在快照差異窗口中,控制器、類型和工具視圖與快照詳細信息窗口中的視圖相同。 快照差異顯示與快照詳細信息相同的信息,并具有以下附加值:

    • “操作” 顯示當前快照中的對象和前一個快照中的對象之間的更改類型。 可能的值包括:

      • “已添加” 自前一個快照以來添加的對象使用綠色進行彩色編碼。

      • “已修改” 自前一個快照以來修改的對象使用藍色進行彩色編碼。

      • “未更改” 自前一個快照以來未更改的對象顯示“未更改”或空白值。 未更改的對象不會泄漏內存。

      • “未更改 [基線]” 未從基線快照更改的對象顯示此值。 這些對象不會泄漏內存。

    • 大小差異 當前快照中對象的大小及其在之前的快照中的大小之間的差異,不包括任何引用對象的大小。

    • 保留的大小差異 當前快照中對象的保留的大小及其在上一個快照中的保留的大小之間的差異。 保留的大小包括對象大小加上其所有沒有其他父對象的子對象的大小。 從實用的角度而言,保留大小是對象保留的內存量,因此,如果你刪除對象,則你回收指定的內存量。

    • 計數差異 當前快照中的對象實例數和上一個快照中的對象實例數之間的差異。 此值僅顯示在類型視圖中。

    在對象樹中查找對象

    在控制器視圖和類型視圖中,你可看到特定對象與 Global 對象的關系。 你可在根視圖中輕松找到已知對象,而無需搜索 Global 對象樹。 為此,請在控制器或類型視圖中打開對象的快捷菜單,然后選擇“在根視圖中顯示”

    篩選數據

    在控制器視圖和類型視圖中,你可以通過搜索特殊標識符來篩選出數據。 若要搜索標識符,請在右上角的“標識符篩選器”文本框中鍵入標識符名稱。 在開始鍵入時,不包含鍵入字符的標識符會被篩選出來。

    由于每個視圖都有其自己的篩選器,因此當你切換到另一個視圖時,不會保留上一個視圖的篩選器。

    查看共享對象引用

    在控制器視圖和類型視圖中,下窗格包含顯示共享引用的對象引用列表。 當你在上窗格中選擇一個對象時,對象引用列表將顯示指向該對象的所有對象。

    如果需要額外的幫助來標識等效對象,請在上窗格的右上角的設置列表中選擇“顯示對象 ID” 此選項將在“標識符”列表中的對象名稱旁顯示對象 ID(ID 將顯示在所有視圖中,而不只是顯示在對象引用列表中)。 具有相同 ID 的對象是共享引用。

    下圖顯示了選定項目的對象引用列表以及顯示的 ID。

    Object references with displayed IDs 顯示內置對象

    默認情況下,控制器和類型視圖僅顯示你在應用程序中創建的對象。 這可幫助你篩選出不需要的信息,并隔離應用程序相關的問題。 但是,有時查看由 JavaScript 運行時為你的應用程序生成的所有對象可能會很有用。

    若要顯示這些對象,請在窗格右上角的設置列表中選擇“顯示內置對象”

    保存診斷會話文件

    診斷快照摘要與其關聯的詳細信息視圖一起保存為 .diagsession 文件。 “解決方案資源管理器”在診斷會話文件夾中顯示前幾個診斷會話。 “解決方案資源管理器”中,可以打開前幾個會話或者刪除或重命名文件。

    將源代碼與內存使用量數據關聯

    若要幫助隔離具有內存問題的代碼部分,可在 JavaScript 內存分析器中使用以下兩條命令:

    • console.takeHeapSnapshot 采用出現在 JavaScript 內存分析器中的堆快照。 此命令是 JavaScript 控制臺命令之一。

    • performance.mark 設置一個用戶標記(倒三角形),該標記在應用程序運行時顯示在摘要視圖中的內存關系圖的時間線上。 此命令采用一個描述事件并且在內存關系圖中顯示為工具提示的字符串參數。 此說明不能超過 100 個字符。

    提示 提示

    重復內存使用量方案時,請使用 console.takeHeapSnapshot 來加速分析。

    如果你將這兩條命令添加到應用程序中并在 JavaScript 內存分析器的外部運行應用程序,則這兩條命令將引發異常。 但是,你可在使用這兩條命令之前測試它們是否存在。(這兩條命令在會話啟動階段的早期不存在。)若要檢查是否可以安全調用 takeHeapSnapshot,請使用此代碼:

    JavaScript
    if (console && console.takeHeapSnapshot) {
        console.takeHeapSnapshot();
    }
    

    若要檢查是否可以安全調用 performance.mark,請使用此代碼:

    JavaScript
    if (performance && performance.mark) {
        performance.mark("message_string");
    }
    
    

    以下是具有多個用戶標記和當前選定用戶標記的工具提示的內存關系圖,其中,performance.mark 字符串參數設置為“data generated”:

    Using a Profile Mark 確定內存問題的提示
    • 按照隔離內存泄漏中描述的工作流操作。

    • 使用快照差異的控制器視圖可幫助快速確定主要內存問題。

    • 使用在根視圖中顯示可查看在內存層次結構中引用對象的位置。

    • 當內存問題的原因時難以確定時,應使用各種視圖(例如控制器和類型)查找共性,例如大小和對象計數不斷增長的關聯的對象和類型。

    • 閱讀 管理 Windows 應用商店應用程序中的內存

    • 考慮臨時修改代碼來隔離問題。 例如,你可能希望:

      • 對內存分析器使用 console.takeSnapshot  performance.mark 命令。(請參見將源代碼與內存使用量數據關聯。)

        可以使用這兩條命令來幫助隔離無法通過手動拍攝堆快照進行隔離的問題。

      • 創建一個測試對象,并在 JavaScript 內存分析器視圖(如控制器視圖)中跟蹤該對象。 例如,可以將一個極大對象附加到另一個對象以查明特定對象或組件是否已進行垃圾回收。

    • 在用戶導航到新頁后,查找無意間保留在內存中的對象,這是導致出現內存問題的一個常見原因。 例如,URL.CreateObjectUrl 函數的使用不當可能導致此問題。

     

    from:http://msdn.microsoft.com/zh-cn/library/windows/apps/jj819176.aspx

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全