垃圾回收機制介紹

      網(wǎng)友投稿 614 2025-04-03

      垃圾回收策略


      javaScript 內(nèi)存管理中有一個概念叫做 可達性,就是那些以某種方式可訪問或者說可用的值,它們被保證存儲在內(nèi)存中,反之不可訪問則需回收

      至于如何回收,其實就是怎樣發(fā)現(xiàn)這些不可達的對象(垃圾)它并給予清理的問題, javaScript 垃圾回收機制的原理說白了也就是定期找出那些不再用到的內(nèi)存(變量),然后釋放其內(nèi)存

      你可能還會好奇為什么不是實時的找出無用內(nèi)存并釋放呢?其實很簡單,實時開銷太大了

      我們都可以 Get 到這之中的重點,那就是怎樣找出所謂的垃圾?

      這個流程就涉及到了一些算法策略,有很多種方式,我們簡單介紹兩個最常見的

      標記清除算法

      引用計數(shù)算法

      標記清除算法

      策略

      標記清除(Mark-Sweep),目前在 JavaScript引擎 里這種算法是最常用的,到目前為止的大多數(shù)瀏覽器的 JavaScript引擎 都在采用標記清除算法,只是各大瀏覽器廠商還對此算法進行了優(yōu)化加工,且不同瀏覽器的 JavaScript引擎 在運行垃圾回收的頻率上有所差異

      就像它的名字一樣,此算法分為 標記 和 清除 兩個階段,標記階段即為所有活動對象做上標記,清除階段則把沒有標記(也就是非活動對象)銷毀

      你可能會疑惑怎么給變量加標記?其實有很多種辦法,比如當變量進入執(zhí)行環(huán)境時,反轉(zhuǎn)某一位(通過一個二進制字符來表示標記),又或者可以維護進入環(huán)境變量和離開環(huán)境變量這樣兩個列表,可以自由的把變量從一個列表轉(zhuǎn)移到另一個列表,當前還有很多其他辦法。其實,怎樣標記對我們來說并不重要,重要的是其策略

      引擎在執(zhí)行 GC(使用標記清除算法)時,需要從出發(fā)點去遍歷內(nèi)存中所有的對象去打標記,而這個出發(fā)點有很多,我們稱之為一組 根 對象,而所謂的根對象,其實在瀏覽器環(huán)境中包括又不止于 全局Window對象、文檔DOM樹 等

      整個標記清除算法大致過程就像下面這樣

      垃圾收集器在運行時會給內(nèi)存中的所有變量都加上一個標記,假設內(nèi)存中所有對象都是垃圾,全標記為0

      然后從各個根對象開始遍歷,把不是垃圾的節(jié)點改成1

      清理所有標記為0的垃圾,銷毀并回收它們所占用的內(nèi)存空間

      最后,把所有內(nèi)存中對象標記修改為0,等待下一輪垃圾回收

      優(yōu)點

      標記清除算法的優(yōu)點只有一個,那就是實現(xiàn)比較簡單,打標記也無非打與不打兩種情況,這使得一位二進制位(0和1)就可以為其標記,非常簡單

      缺點

      標記清除算法有一個很大的缺點,就是在清除之后,剩余的對象內(nèi)存位置是不變的,也會導致空閑內(nèi)存空間是不連續(xù)的,出現(xiàn)了 內(nèi)存碎片(如下圖),并且由于剩余空閑內(nèi)存不是一整塊,它是由不同大小內(nèi)存組成的內(nèi)存列表,這就牽扯出了內(nèi)存分配的問題

      綜上所述,標記清除算法或者說策略就有兩個很明顯的缺點

      內(nèi)存碎片化,空閑內(nèi)存塊是不連續(xù)的,容易出現(xiàn)很多空閑內(nèi)存塊,還可能會出現(xiàn)分配所需內(nèi)存過大的對象時找不到合適的塊

      分配速度慢,因為即便是使用 First-fit 策略,其操作仍是一個 O(n) 的操作,最壞情況是每次都要遍歷到最后,同時因為碎片化,大對象的分配效率會更慢

      引用計數(shù)算法

      策略

      引用計數(shù)(Reference Counting),這其實是早先的一種垃圾回收算法,它把 對象是否不再需要 簡化定義為 對象有沒有其他對象引用到它,如果沒有引用指向該對象(零引用),對象將被垃圾回收機制回收,目前很少使用這種算法了,因為它的問題很多,不過我們還是需要了解一下

      它的策略是跟蹤記錄每個變量值被使用的次數(shù)

      當聲明了一個變量并且將一個引用類型賦值給該變量的時候這個值的引用次數(shù)就為 1

      如果同一個值又被賦給另一個變量,那么引用數(shù)加 1

      垃圾回收機制介紹

      如果該變量的值被其他的值覆蓋了,則引用次數(shù)減 1

      當這個值的引用次數(shù)變?yōu)?0 的時候,說明沒有變量在使用,這個值沒法被訪問了,回收空間,垃圾回收器會在運行的時候清理掉引用次數(shù)為 0 的值占用的內(nèi)存

      優(yōu)點

      引用計數(shù)算法的優(yōu)點我們對比標記清除來看就會清晰很多,首先引用計數(shù)在引用值為 0 時,也就是在變成垃圾的那一刻就會被回收,所以它可以立即回收垃圾

      而標記清除算法需要每隔一段時間進行一次,那在應用程序(JS腳本)運行過程中線程就必須要暫停去執(zhí)行一段時間的 GC,另外,標記清除算法需要遍歷堆里的活動以及非活動對象來清除,而引用計數(shù)則只需要在引用時計數(shù)就可以了

      缺點

      引用計數(shù)的缺點想必大家也都很明朗了,首先它需要一個計數(shù)器,而此計數(shù)器需要占很大的位置,因為我們也不知道被引用數(shù)量的上限,還有就是無法解決循環(huán)引用無法回收的問題,這也是最嚴重的

      JavaScript

      版權聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權內(nèi)容。

      版權聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權內(nèi)容。

      上一篇:【華為云專家原創(chuàng)】微服務架構中使用 ELK 進行日志采集以及統(tǒng)一處理
      下一篇:99%的HR都不會用的技能 用圖表展示員工工資水平的分布情況(HR的技能要求)
      相關文章
      亚洲国产人成精品| 亚洲精品在线免费看| 亚洲男人电影天堂| 亚洲AV乱码久久精品蜜桃| 亚洲线精品一区二区三区影音先锋| www.亚洲一区| www.亚洲精品| 色窝窝亚洲AV网在线观看| 亚洲成a∧人片在线观看无码| 亚洲熟妇无码AV| 亚洲国产精品网站在线播放| 亚洲偷自拍另类图片二区| 亚洲AV无码国产精品色| 亚洲娇小性xxxx| 亚洲娇小性xxxx| 亚洲av中文无码乱人伦在线观看| 亚洲熟妇无码一区二区三区导航 | 国产成人毛片亚洲精品| 亚洲人成电影网站国产精品 | 亚洲第一区精品观看| 亚洲美女高清一区二区三区| 国产精品亚洲不卡一区二区三区 | 亚洲Av高清一区二区三区| jlzzjlzz亚洲jzjzjz| 亚洲精品一二三区| 欧洲亚洲国产精华液| 亚洲国产精品丝袜在线观看| 国产成人亚洲综合无码| 亚洲精品无码久久久久| 亚洲国产成人私人影院| 亚洲欧洲精品国产区| 亚洲日本久久久午夜精品| 亚洲AV无码资源在线观看| 亚洲第一页日韩专区| 日本亚洲国产一区二区三区| 亚洲AV无码久久精品狠狠爱浪潮| 久久久久久亚洲Av无码精品专口 | 综合亚洲伊人午夜网 | 亚洲人成在线电影| 亚洲日本乱码一区二区在线二产线| 亚洲精品中文字幕无乱码|