記憶體術語
記憶體工具中會使用下列詞彙,以調查記憶體問題。 這些記憶體詞彙一般適用於記憶體分析,以及 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
) 。 - 布爾值 (
true
或false
) 。 - 字串 (例如
"Werner Heisenberg"
) 。
基本類型無法參考其他值,而且一律是分葉節點, (也稱為終止記憶體圖形中) 節點 。
數位 可以儲存為下列其中一種:
直接的31位整數值,稱為 小整 數 (SPI) 。
堆積物件,稱為 堆積編號。 堆積編號可用來儲存不符合 SMI) 格式之小整數 (值,例如類型
double
為的值,或需要將值裝入方塊時,例如設定其屬性。
字串 可以儲存在下列其中一個位置:
VM 堆積。
在轉 譯器的記憶體外部。 包裝 函式物件 會建立並用於存取外部記憶體,例如,從 Web 接收到的腳本來源和其他內容會儲存,而不是複製到 VM 堆積。
JavaScript 物件
新 JavaScript 物件的記憶體是從專用的 JavaScript 堆積 (或 VM 堆積) 配置。 這些物件是由 V8 VM 的垃圾收集行程所管理,因此,只要至少有一個對象參考,這些物件就會保持運作。
其他物件
原生物件:未儲存在 JavaScript 堆積中的任何專案都稱為 原生物件。 相較於堆積物件,原生物件不會在其存留期內由 V8 垃圾收集行程管理,而且只能使用其 JavaScript 包裝函式物件從 JavaScript 存取。
串連的字串:由於 JavaScript 中的字串串連而儲存並聯結在一起的字串,會儲存為 V8 中的 串連字串 。 字串內容的聯結只會視需要發生,例如需要建構聯結字串的子字串時。
例如,如果您串連
a
和b
,您會取得串連字串(a, b)
,表示串連的結果。 如果您稍後與該結果串連c
,您會收到另一個串連字串:((a, b), c)
。陣列:陣 列 是具有數值索引鍵的物件。 數位在 V8 VM 中廣泛用於儲存大量數據。 像字典一樣使用的索引鍵/值組會實作為數位。
典型的 JavaScript 物件只會儲存為兩種數位類型的其中一種:
- 用來儲存具名屬性的陣列。
- 用來儲存數值元素的陣列。
當有少量的屬性時,屬性會儲存在 JavaScript 物件內部。
system / Map:物件,描述對象的種類和版面配置。 例如, 系統/Map 物件可用來描述隱含的物件階層,以便快速存取屬性。 請參閱 V8 中的快速屬性。
注意事項
此頁面的部分是根據Google所建立和 共用的工作進行 修改,並根據 Creative Commons Attribution 4.0 國際授權中所述的條款使用。 原始頁面 可在這裡 找到,並由 Meggin Kearney 撰寫。
此工作是根據 Creative Commons Attribution 4.0 International License 授權。