共用方式為


記憶體術語

記憶體工具中會使用下列詞彙,以調查記憶體問題。 這些記憶體詞彙一般適用於記憶體分析,以及 Java 或 .NET 等語言的記憶體分析工具。

若要深入瞭解如何使用 記憶體 工具,請參閱 使用記憶體工具 (「堆積快照集」分析類型) 記錄堆積快照集

記憶體圖表

將網頁所使用的記憶體視為圖形:包含邊緣連接在一起之節點結構:

記憶體的視覺表示法

記憶體圖形中的節點代表頁面所使用的物件,包括 JavaScript 數位或字串等基本類型,以及關聯數位等物件。 記憶體圖形中的節點和邊緣會獲得下列標籤:

  • 節點 (或 物件) 會使用用來建置它們的 建構函 式名稱來標示。

  • 邊緣會 使用 屬性的名稱標示。

圖形中的節點可以用兩種方式來保存記憶體:

  • 徑直;記憶體是由物件本身所持有。

  • 隱含地保存其他對象的參考。 保留其他物件參考的物件可防止垃圾收集 (GC) 自動處置這些物件。

JavaScript 堆積和轉譯器記憶體

JavaScript 堆積是瀏覽器進程中所有 JavaScript 和 WebAssembly 物件存取所在的記憶體區域。 JavaScript 堆積也稱為 V8 記憶體 (,其位於支援 Microsoft Edge) 的 V8 JavaScript 引擎之後。

JavaScript 堆積是轉譯器記憶體的一部分。 轉譯器記憶體是轉譯網頁的瀏覽器進程所使用的記憶體。 轉譯器記憶體由下列項目組成:

  • 原生記憶體,例如C++代表 DOM 節點之物件所使用的記憶體。
  • 頁面的 JavaScript 堆積記憶體。
  • 頁面所啟動之所有專用背景工作角色的 JavaScript 堆積記憶體。

記憶體工具會顯示兩者:

  • V8 記憶體。
  • 在原生記憶體中配置的物件,與轉譯的網頁相關。

垃圾收集根目錄

從瀏覽器的原生程式代碼到 V8 虛擬機器外部的 JavaScript 物件進行參考時,瀏覽器會建立壟圾收集根 (GC 根) 。 這些參考稱為 句柄

有許多內部 GC 根目錄,其中大部分對 Web 開發人員來說並不感興趣。 從網頁的觀點來看,存在下列類型的 GC 根目錄:

  • 視窗全域物件 (每個 iframe) 中一個。

  • 有時候物件會由 來源控制台 工具所設定的偵錯內容保留,例如在 控制台 工具中評估 JavaScript 表達式時。 若要從 記憶體 工具移除這些物件,請在錄製堆積快照集之前,清除 主控台 工具,並在 [來源 ] 工具中停用斷點。

記憶體圖表的開頭是 GC 根目錄,可能是 window 瀏覽器的物件或 Global Node.js 模組的物件。 您無法控制根物件的垃圾收集方式:

您無法控制根物件的垃圾收集方式

無法從根目錄連線的節點可以進行垃圾收集。

物件大小和距離

記憶體工具會顯示下列資訊資料列:

  • Distance 數據行
  • 淺層大小數據行
  • [ 保留大小] 資料行

記憶體工具中的 [距離]、[淺層大小] 和 [保留大小] 資料行

這些數據行如下所述。

Distance (距離)

JavaScript 堆積中對象的 距離 是物件與 GC 根目錄之間最短路徑上的節點數目。 距離越短,這個物件在網頁的記憶體使用量中扮演重要角色的可能性就越大。

淺層大小

淺層大小是物件直接持有的 JavaScript 堆積大小。 對象的淺層大小通常很小,因為 JavaScript 物件通常只會將物件的描述儲存在物件的直接保留記憶體中,而非值。 大部分的 JavaScript 物件都會將其值儲存在 JavaScript 堆積中其他位置的支援 存放 區中,而且只會在物件直接擁有的 JavaScript 堆積部分公開小型包裝函式物件。

不過,即使是小型物件也可以 間接保存大量的記憶體,方法是防止垃圾收集程序處置其他物件。

[ 淺層大小 ] 數據行中的數位是位元元數目。

保留大小

保留的大小是物件隱含保留的記憶體大小,一旦刪除物件和其他現有的保留器,以及所有從 GC 根目錄無法連線的相依物件,就可以釋放該大小。

也就是說,如果物件及其所有相依物件都從記憶體圖形中移除,則物件的保留大小是重新取得的記憶體數量。

保留的大小不能小於淺層大小。

當多個節點保留物件時,物件的大小會出現在具有 GC 根目錄最短路徑的保留節點保留大小中。

[ 保留大小 ] 資料行中的數位是位元組數目。

保留器

物件的 保留器 是保存物件參考的其他物件。 [記憶體] 工具的 [保留] 區段會顯示保留 [摘要] 檢視中所選物件參考的物件。

記憶體工具的 Retainers 區段預設會依距離排序,這表示會先顯示物件最簡單的保留路徑。

瀏覽器的垃圾收集行程可以捨棄任何沒有保留器的物件,以減少記憶體使用量。

V8 特定專案

分析記憶體時,了解堆積快照集為何以特定方式顯示會很有説明。 本節說明 V8 JavaScript 虛擬機 如何將某些物件儲存在記憶體中, (此處縮寫為 V8 VM,或只是 VM) ,這可協助您分析 記憶體 工具中的堆積快照集。

JavaScript 基本類型

在 JavaScript 中,有數種基本類型,例如:

  • 數位 (例如 3.14159) 。
  • 布爾值 (truefalse) 。
  • 字串 (例如 "Werner Heisenberg") 。

基本類型無法參考其他值,而且一律是分葉節點, (也稱為終止記憶體圖形中) 節點

數位 可以儲存為下列其中一種:

  • 直接的31位整數值,稱為 小整 數 (SPI) 。

  • 堆積物件,稱為 堆積編號。 堆積編號可用來儲存不符合 SMI) 格式之小整數 (值,例如類型 double為的值,或需要將值裝入方塊時,例如設定其屬性。

字串 可以儲存在下列其中一個位置:

  • VM 堆積

  • 在轉 譯器的記憶體外部。 包裝 函式物件 會建立並用於存取外部記憶體,例如,從 Web 接收到的腳本來源和其他內容會儲存,而不是複製到 VM 堆積。

JavaScript 物件

新 JavaScript 物件的記憶體是從專用的 JavaScript 堆積 (或 VM 堆積) 配置。 這些物件是由 V8 VM 的垃圾收集行程所管理,因此,只要至少有一個對象參考,這些物件就會保持運作。

其他物件

  • 原生物件:未儲存在 JavaScript 堆積中的任何專案都稱為 原生物件。 相較於堆積物件,原生物件不會在其存留期內由 V8 垃圾收集行程管理,而且只能使用其 JavaScript 包裝函式物件從 JavaScript 存取。

  • 串連的字串:由於 JavaScript 中的字串串連而儲存並聯結在一起的字串,會儲存為 V8 中的 串連字串 。 字串內容的聯結只會視需要發生,例如需要建構聯結字串的子字串時。

    例如,如果您串連 ab,您會取得串連字串 (a, b) ,表示串連的結果。 如果您稍後與該結果串連 c ,您會收到另一個串連字串: ((a, b), c)

  • 陣列:陣 是具有數值索引鍵的物件。 數位在 V8 VM 中廣泛用於儲存大量數據。 像字典一樣使用的索引鍵/值組會實作為數位。

    典型的 JavaScript 物件只會儲存為兩種數位類型的其中一種:

    • 用來儲存具名屬性的陣列。
    • 用來儲存數值元素的陣列。

    當有少量的屬性時,屬性會儲存在 JavaScript 物件內部。

  • system / Map:物件,描述對象的種類和版面配置。 例如, 系統/Map 物件可用來描述隱含的物件階層,以便快速存取屬性。 請參閱 V8 中的快速屬性

注意事項

此頁面的部分是根據Google所建立和 共用的工作進行 修改,並根據 Creative Commons Attribution 4.0 國際授權中所述的條款使用。 原始頁面 可在這裡 找到,並由 Meggin Kearney 撰寫。

Creative Commons 授權 此工作是根據 Creative Commons Attribution 4.0 International License 授權