1.垃圾回收
對于開發者來說,JavaScript 的內存管理是自動的、無形的。我們創建的原始值、對象、函數……這一切都會占用內存。
可達性(Reachability)
JavaScript 中主要的內存管理概念是 可達性。
簡而言之,“可達”值是那些以某種方式可訪問或可用的值。它們一定是存儲在內存中的。
-
這里列出固有的可達值的基本集合,這些值明顯不能被釋放。
比方說:
- 當前執行的函數,它的局部變量和參數。
- 當前嵌套調用鏈上的其他函數、它們的局部變量和參數。
- 全局變量。
- (還有一些內部的)
這些值被稱作 根(roots)。
-
如果一個值可以通過引用鏈從根訪問任何其他值,則認為該值是可達的。
比方說,如果全局變量中有一個對象,并且該對象有一個屬性引用了另一個對象,則 該 對象被認為是可達的。而且它引用的內容也是可達的。
在 JavaScript 引擎中有一個被稱作 垃圾回收器 的東西在后臺執行。它監控著所有對象的狀態,并刪除掉那些已經不可達的。
垃圾回收算法:
JavaScript具有自動垃圾收集機制,也就是說,執行環境將負責管理代碼執行過程中使用的內存。
在JavaScript中,如果一個對象不再被引用,那么這個對象就會被垃圾回收器回收,當對象被回收之后,這塊內存就可以被再次使用。
JavaScript有兩種垃圾回收機制:
1. 標記清除(Mark-and-sweep):這是JavaScript中最常見的垃圾收集方式,當變量進入環境(例如,在函數中聲明一個變量)時,就將這個變量標記為“進入環境”。當變量離開環境時,則將其標記為“離開環境”。
2. 引用計數(Reference counting):引用計數是另一種垃圾回收策略,引用計數的含義是跟蹤每個值被引用的次數。當聲明了一個變量并將一個引用類型值賦值給該變量時,這個值的引用次數就是1。如果同一個值又被賦值給另一個變量,那么這個值的引用次數就增加了1。相反,如果包含對這個值引用的變量又取得了另外一個值,那么這個值的引用次數就減少1。當這個值的引用次數變為0時,說明沒有辦法訪問這個值了,因此就可以將其占用的內存空間回收回來。這樣,當垃圾收集器下次運行時,它就會釋放那些引用次數為0的值所占用的內存。
這兩種方式都有自己的優缺點,但標記清除是目前主流的垃圾回收方式,主要的原因是它不會導致循環引用的問題。
面試的時候,JavaScript的垃圾回收怎么回答?
JavaScript的垃圾回收是一種自動化的內存管理機制,用于幫助我們管理內存中不再使用的對象,以便釋放內存空間供其他對象使用。當一個對象不再被引用時,垃圾回收機制會自動將其標記為"垃圾",然后在適當的時機進行回收和釋放內存。
在面試時,你可以回答以下幾個方面來解釋JavaScript的垃圾回收:
1.引用計數:這是一種最早的垃圾回收算法,在JavaScript中并未廣泛使用。它通過對每個對象記錄引用數來決定對象是否為垃圾。當引用數為時,對象即被判定為垃圾,并被回收。然而,該算法存在循環引用的問題,循環引用的對象無法被回收。
2.標記-清除算法:這是JavaScript中最常用的垃圾回收算法。它通過從根對象開始進行遍歷,標記所有能夠訪問到的對象,然后清除掉未被標記的對象,即垃圾對象。這個過程可以通過JavaScript解釋器中的垃圾回收器自動執行。
3.并行和增量回收:為了提高垃圾回收的效率,現代瀏覽器通常采用并行和增量回收策略。并行回收利用多個線程來同時執行垃圾回收,減少回收過程對主線程的阻塞時間。增量回收則將垃圾回收過程分成多個小步驟,在執行每個小步驟之間允許主線程執行其他任務,從而減少垃圾回收對整體性能的影響。
4.內存泄漏:雖然JavaScript具有自動垃圾回收機制,但仍然存在內存泄漏的可能性。內存泄漏指當不再需要使用的對象仍然被引用時,垃圾回收器無法將其回收,導致內存使用量持續增加。常見的內存泄漏原因包括未及時釋放事件監聽器、閉包中的變量引用等。在開發過程中,需要注意及時釋放不再使用的對象,避免內存泄漏問題。
總結:
垃圾回收簡要回答:
(1)垃圾回收是JavaScript引擎的一種自動內存管理機制,主要負責找出那些不再繼續使用的變量或對象,并釋放其占用的內存。JavaScript中的垃圾回收主要基于“標記-清除”和“引用計數”兩種策略。
(2)“標記-清除”是最常見的垃圾回收方式。它的工作原理是,垃圾回收機制定時運行,查找并標記所有活動對象,然后清除掉那些沒有被標記的對象占用的內存。
(3)“引用計數”是另一種垃圾回收方式。它的工作原理是,每當引用關系改變時,如賦值或參數傳遞等,就修改引用計數。當某個對象的引用計數變為0時,就立即釋放其占用的內存。
(4)JavaScript的垃圾回收是自動進行的,無需開發者手動操作,但了解這個過程對編寫高效、優秀的JavaScript代碼是十分有必要的。
浙公網安備 33010602011771號