Chrome 開發(fā)者工具的內(nèi)存分析工具

在理解 Chrome 開發(fā)者工具的內(nèi)存分析工具之前,你需要理解一些基本的內(nèi)存概念。
內(nèi)存生命周期
內(nèi)存的生命周期包括以下三個步驟:
分配:你獲取一些內(nèi)存以便使用。這可能是通過聲明一個新的變量或者通過調(diào)用一個分配函數(shù)(如 malloc)來完成的。
使用:你讀取或寫入這塊內(nèi)存。這可能是通過讀取或寫入變量的值來完成的。
釋放:一旦你完成了對內(nèi)存的使用,你需要將其釋放,以便它可以被重新分配。在某些語言中,這是通過顯式調(diào)用一個釋放函數(shù)(如 free)來完成的。在JavaScript中,這是通過垃圾回收來自動完成的。
JavaScript 內(nèi)存管理
JavaScript 自動管理內(nèi)存。你分配內(nèi)存,使用它,然后當你完成使用時,JavaScript 會自動為你釋放內(nèi)存。這種自動內(nèi)存管理被稱為垃圾回收。
垃圾回收
垃圾回收器定期(或者在你的應用程序運行緩慢時)查找不再需要的內(nèi)存。它找到這些內(nèi)存,然后釋放它們。
垃圾回收器如何知道內(nèi)存不再需要了呢?簡單來說,如果內(nèi)存不能被訪問到,那么它就不再需要了。例如,如果一個變量在函數(shù)外部是不可訪問的,那么這個變量就不再需要了。
內(nèi)存泄漏
如果你的應用程序持續(xù)消耗更多的內(nèi)存,而不釋放它,那么你的應用程序就有內(nèi)存泄漏。內(nèi)存泄漏可能會導致你的應用程序運行緩慢,或者甚至崩潰。
堆(Heap)
堆是一種數(shù)據(jù)結構,它用于存儲對象。在 JavaScript 中,所有的對象都存儲在堆中。
堆快照
堆快照是堆的一個靜態(tài)快照。你可以使用 Chrome 開發(fā)者工具來獲取和查看堆快照。

分配時間線
分配時間線是一個動態(tài)的視圖,它顯示了你的應用程序在一段時間內(nèi)分配和釋放內(nèi)存的情況。你可以使用 Chrome 開發(fā)者工具來獲取和查看分配時間線。

在 Chrome 開發(fā)者工具的內(nèi)存分析中,Shallow Size 和 Retained Size 是兩個重要的概念。

Shallow Size:這是一個對象自身分配的內(nèi)存大小,不包括它引用的其他對象。
Retained Size:這是一個對象及其所有依賴(即,可以通過該對象訪問的所有對象)的總內(nèi)存大小。換句話說,如果進行垃圾回收,那么這個對象被清除后,將會釋放的內(nèi)存大小。
舉個例子,假設有一個對象 A,它自身的大小是 10 字節(jié),這就是它的 Shallow Size。然后,它引用了另外兩個對象 B 和 C,它們的大小分別是 20 字節(jié)和 30 字節(jié)。那么對象 A 的 Retained Size 就是 10 + 20 + 30 = 60 字節(jié)。也就是說,如果對象 A 被垃圾回收,那么將會釋放 60 字節(jié)的內(nèi)存。
在 Chrome 開發(fā)者工具的內(nèi)存分析中,"(compiled code)×8167" 這個條目表示的是已經(jīng)被 JavaScript 引擎編譯過的代碼。
JavaScript 是一種解釋型語言,但為了提高執(zhí)行效率,現(xiàn)代的 JavaScript 引擎(如 V8)會在運行時將 JavaScript 代碼編譯(或者說轉化)成機器代碼。這種編譯過程通常是即時的(Just-In-Time,JIT),也就是說,代碼在執(zhí)行的時候才被編譯。
"(compiled code)×8167" 中的 "compiled code" 就是指這些被編譯過的代碼,"×8167" 表示的是這種類型的對象(也就是編譯過的代碼)的數(shù)量。
這個條目的存在可以幫助你了解應用程序的內(nèi)存使用情況。如果 "(compiled code)" 的數(shù)量特別多,可能表示你的應用程序有大量的代碼正在執(zhí)行,或者有大量的代碼被多次編譯。這可能是一個性能優(yōu)化的點。
在 Chrome 開發(fā)者工具的內(nèi)存分析中,"(system)×32567" 這個條目表示的是系統(tǒng)級別的對象或資源。
"(system)" 是一個特殊的類別,它包括了由 JavaScript 引擎或瀏覽器內(nèi)部使用的一些對象或資源,這些對象或資源通常對開發(fā)者是不可見的,也不能直接通過 JavaScript 代碼來訪問或控制。
"×32567" 表示的是這種類型的對象(也就是系統(tǒng)級別的對象或資源)的數(shù)量。
這個條目的存在可以幫助你了解應用程序的內(nèi)存使用情況。如果 "(system)" 的數(shù)量特別多,可能表示你的應用程序正在使用大量的系統(tǒng)資源。然而,由于這些資源通常不能直接被控制,所以它們更多的是提供了一個參考,而不是一個可以直接優(yōu)化的點。
在 Chrome 開發(fā)者工具的內(nèi)存分析中,"(array)×2200" 這個條目表示的是數(shù)組類型的對象。
"(array)" 是一個特殊的類別,它表示 JavaScript 中的數(shù)組對象。
"×2200" 表示的是這種類型的對象(也就是數(shù)組對象)的數(shù)量。
這個條目的存在可以幫助你了解應用程序的內(nèi)存使用情況。如果 "(array)" 的數(shù)量特別多,可能表示你的應用程序正在使用大量的數(shù)組。這可能是一個性能優(yōu)化的點,特別是當這些數(shù)組占用了大量的內(nèi)存或者沒有被正確地釋放時。
