搜尋
首頁web前端js教程深入淺析JS中的垃圾回收機制

深入淺析JS中的垃圾回收機制

Mar 02, 2023 pm 07:31 PM
javascript垃圾回收機制

基本型別存放在堆疊中,引用型別存放在堆疊中。 JavaScript 是在創建變數(對象,字串等)時自動進行了分配內存,並且在不使用它們時“自動”釋放。釋放的過程稱為垃圾回收。

深入淺析JS中的垃圾回收機制

垃圾回收策略

所有垃圾回收器都需要做的任務

  • 標記空間中活動(存活)物件和非活動(非存活)物件

  • 回收或重複使用被非活動物件佔據的記憶體

  • 記憶體整理,防止記憶體碎片的出現

#什麼是垃圾物件?

一般來說沒有被引用的物件就是垃圾,就是要被清除。從根開始遍歷對象。

例外
如果幾個物件引用形成一個環,互相引用,但根訪問不到它們,這幾個物件也是垃圾,也要被清除。

什麼是根物件和存活物件

#根物件
有一組基本的固有可達值,由於顯而易見的原因無法刪除

  • 全域變數window全域物件、DOM文檔樹根物件等

存活物件
如果引用或引用鏈可以從根存取任何其他值,則認為該值是可存取的

V8引擎回收分代回收法

將堆分為新生代和老生代。
新生代中存放的是生存時間短的對象,老生代中存放的生存時間久的對象。

新生代垃圾回收器scavenge複製演算法

#將堆記憶體分成兩部分,一個是使用區,處於使用狀態的空間;另一個是空閒區,處於空閒狀態的空間。

  • 新加入的物件會存放到使用區,當使用區快被寫滿時,就需要進行垃圾清理操作。

  • 新生代垃圾回收器會對使用區的活動物件物件做標記,標記完成之後將使用區的活動物件複製到空閒區。解決了記憶體散落分塊的問題。

  • 將使用區的非活動物件佔用的空間清理掉。最後進行角色互換,原來的使用區變成新的空閒區,原來的空閒區變成新的使用區。

移動到老生代的物件

  • #如果一個物件多次複製後仍然存活,將被認為時生命週期較長的對象,隨後被移動到老生代。
  • 複製一個物件到空閒區時,佔用空閒區空間超過了25%,這個物件會被直接晉升到老生代空間中。原因是原來的空閒區會變成新的使用區,繼續進行物件記憶體的分配,若佔比過高,新物件的可用空間太少。

新生代優化並行回收

#全停頓問題
JavaScript是單執行緒語言,運行在主執行緒上,進行垃圾回收時會阻塞JavaScript腳本的執行,需要等待垃圾回收完畢後再恢復腳本執行。

如果一次GC的時間過長,可能造成頁面卡頓現象。

並行回收機制
垃圾回收器在主執行緒上執行的過程中,開啟多個輔助線程,同時執行同樣的回收工作。

深入淺析JS中的垃圾回收機制

老生代垃圾回收

使用scavenge方式存在的問題
1.存活對象較多,頻繁複製存活物件效率將降低
2.浪費一半空間

主要採用標記-清除法,在記憶體分配不足時,採用標記-整理

老年代垃圾回收期所採用的演算法
1. 首先使用標記-清除完成垃圾空間的回收;
2. 採用標記-整理進行空間最佳化;
3. 採用最佳化-增量標記與惰性清理進行效率最佳化;

#標記-清除與標記-整理演算法



###################### ###scavenge只複製活著的對象,而標記-清除只清除死了的對象。 ######活對像在新生代中只佔較少部分,死對像在老生代中只佔較少部分,這就是兩種回收方式都能高效處理的原因###。 #########缺點###### 記憶體碎片太多。如果出現需要分配一個大記憶體的情況,由於剩餘的碎片空間不足以完成此分配,就會提前觸發垃圾回收,而這次回收是不必要的。 ###

-> 標記-整理演算法 標記完存活物件後,將存活物件向記憶體空間的一端移動,移動完成後,清除掉邊界外的所有記憶體

優化-增量標記與惰性清理

增量標記

#如果有很多對象,並且我們試圖一次遍歷並標記整個對象集,那麼可能會花費一些時間,並在執行上會有一定的延遲。因此,引擎試圖將垃圾回收分解為多個部分。然後,各個部分分別執行。

V8對老生代垃圾回收器進行了最佳化,從全停頓標記切換到增量標記
將一次垃圾回收變成一小段一小段GC垃圾回收
深入淺析JS中的垃圾回收機制
如果採用非黑即白(存活和死亡)的標記策略,那在垃圾回收器執行了一段增量回收後,暫停後啟用主線程去執行了應用程式中的一段JavaScript 程式碼,隨後當垃圾回收器再次被啟動,這時候內存中黑白色都有,我們無法得知下一步走到哪裡了

惰性清理

增量標記完成後,惰性清理就開始了。當增量標記完成後,假如目前的可用記憶體足以讓我們快速的執行程式碼,其實我們是沒必要立即清理記憶體的,可以將清理過程稍微延遲一下,讓JavaScript 腳本程式碼先執行,也不需要一次清理完所有非活動物件內存,可以按需逐一進行清理直到所有的非活動物件內存都清理完畢,後面再接著執行增量標記

三色標記法暫停和恢復

三色標記法的mark 操作可以漸進執行的而不需每次都掃描整個內存空間,可以很好的配合增量回收進行暫停恢復的一些操作,從而減少全停頓的時間

  • 白色:未被標記的物件
  • 灰色:自身被標記,該物件的引用物件未被標記
  • 黑色:自身和該物件的參考物件(箭頭指的物件)都被標記

深入淺析JS中的垃圾回收機制
從一組根物件開始,先將這組根物件標記為灰色並推入到標記工作表中,當回收器從標記工作表中彈出物件並存取它的引用物件時,將其自身由灰色轉變成黑色,並將自身的下一個引用物件轉為灰色

就這樣一直往下走,直到沒有可標記灰色的物件時,也就是無可達的物件了,那麼剩下的所有白色物件都是無法到達的,即等待回收。

目前記憶體中有沒有灰色節點來判斷整個標記是否完成,如沒有灰色節點,直接進入清理階段,如還有灰色標記,恢復時直接從灰色的節點開始繼續執行就可以

寫入屏障

一次完整的GC標記分塊暫停後,執行任務程序,修改了物件的引用關係。
深入淺析JS中的垃圾回收機制
假設在第一次增量分段中全部將ABC標記為黑色,然後執行JavaScript腳本,將B->D,開始執行第二次增量分段。

新物件D是初始的白色,但此時沒有灰色物件了,也就是全部標記完成需要開始清理了,D將會在清理階段被回收。這是不對的。
V8引入寫入屏障機制,一旦有黑色物件引用白色對象,機制就會將引用的白色物件變成灰色

並發回收
  • 並行回收會阻塞主執行緒
  • 增量標記增加了總暫停時間、降低應用程式吞吐量

主執行緒在執行JavaScript 的過程中,輔助執行緒能夠在背景完成執行垃圾回收的操作
深入淺析JS中的垃圾回收機制

【推薦學習: javascript高階教學

以上是深入淺析JS中的垃圾回收機制的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:csdn。如有侵權,請聯絡admin@php.cn刪除
使用Next.js(後端集成)構建多租戶SaaS應用程序使用Next.js(後端集成)構建多租戶SaaS應用程序Apr 11, 2025 am 08:23 AM

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

如何使用Next.js(前端集成)構建多租戶SaaS應用程序如何使用Next.js(前端集成)構建多租戶SaaS應用程序Apr 11, 2025 am 08:22 AM

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript:探索網絡語言的多功能性JavaScript:探索網絡語言的多功能性Apr 11, 2025 am 12:01 AM

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的演變:當前的趨勢和未來前景JavaScript的演變:當前的趨勢和未來前景Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

神秘的JavaScript:它的作用以及為什麼重要神秘的JavaScript:它的作用以及為什麼重要Apr 09, 2025 am 12:07 AM

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python還是JavaScript更好?Python還是JavaScript更好?Apr 06, 2025 am 12:14 AM

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。1.Python以简洁语法和丰富库生态著称,适用于数据分析和Web开发。2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。

如何安裝JavaScript?如何安裝JavaScript?Apr 05, 2025 am 12:16 AM

JavaScript不需要安裝,因為它已內置於現代瀏覽器中。你只需文本編輯器和瀏覽器即可開始使用。 1)在瀏覽器環境中,通過標籤嵌入HTML文件中運行。 2)在Node.js環境中,下載並安裝Node.js後,通過命令行運行JavaScript文件。

在Quartz中如何在任務開始前發送通知?在Quartz中如何在任務開始前發送通知?Apr 04, 2025 pm 09:24 PM

如何在Quartz中提前發送任務通知在使用Quartz定時器進行任務調度時,任務的執行時間是由cron表達式設定的。現�...

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能