敲開內存管理以及垃圾回收的大門

作為一個前端同學我們跨過了只關注實現(xiàn)業(yè)務功能的階段后,會進入一個瓶頸豌熄。在這個瓶頸階段,我們需要通過更多的知識實踐來積累物咳,讓我們跨過這段平臺期锣险。前端架構、框架原理、性能優(yōu)化等都是我們需要取掌握的技能囱持。本章節(jié)就從性能優(yōu)化的一個角度----JavaScript性能優(yōu)化 進化吧夯接!

內存管理

如果我們在日常的編程中不注意管理內存,會導致內存泄露, 產(chǎn)生瀏覽器崩潰等情況纷妆。

內存管理: 開發(fā)者主動申請盔几、使用、釋放內存空間

//申請
let obj = {}
//使用
obj.name = "zicoo"
//釋放
obj = null

JavaScript 中的垃圾回收

  • JavaScript中內存管理是自動的
  • 對象不再被引用時是垃圾
  • 對象不能從根上訪問到時是垃圾

可達對象

  • 可以訪問到的對象就是可達對象(引用掩幢、作用域鏈)
  • 可達的標準是從根觸發(fā)是否能夠被找到
  • javascirpt 中的根可以理解為全局變量對象

引用與可達

let obj = {name: "sam"}
let obj1 = obj
obj = null //obj 仍然可達

GC - 垃圾回收機制

  • GC是一種機制逊拍,垃圾回收器完成具體的工作
  • 工作的內容是查找垃圾釋放空間、回收空間
  • 算法就是工作中查找和回收所遵循的規(guī)則

常見GC算法

  • 引用計數(shù)
  • 標記清除
  • 標記整理
  • 分代回收

引用計數(shù)

核心思想: 設置引用計數(shù)器际邻,判斷當前引用數(shù)為否為0

優(yōu)點:

  • 發(fā)現(xiàn)垃圾立即回收
  • 最大限度減少程序暫停

缺點:

  • 無法回收循環(huán)引用的對象
  • 時間開銷大
function fn() {
    const obj1 = {}
    const obj2 = {}

    obj1.name = obj2
    obj2.name = obj1 //obj1 obj2 循環(huán)引用 無法將引用計數(shù)器清0
}
fn()

標記清除

核心思想: 分標記和清除兩個階段

  • 遍歷所有對象找到標記活動對象
  • 遍歷所有對象清除沒有標記的對象
  • 回收相應的空間

執(zhí)行時間點: 當有效內存空間被耗盡的時候芯丧,會停止程序執(zhí)行標記清除

標記活動對象依舊是從根出發(fā),遞歸的方式遍歷從根能到達的所有節(jié)點世曾,并且標記為活動對象缨恒, 而未標記活動對象的節(jié)點則就是待回收節(jié)點

優(yōu)點:

  • 對于循環(huán)引用的對象可以被回收,可以彌補引用計數(shù)的缺點

缺點:

  • 由于內存空間申請的時候是有序申請轮听,但是回收的時候節(jié)省的內存空間信息是不會整合的骗露,導致節(jié)省的內存空間不連續(xù),從而造成空間碎片化

標記整理

  • 標記整理算法是標記清除的增強
  • 標記階段的操作和標記清除一致
  • 清除階段會先執(zhí)行整理血巍,移動對象位置萧锉, 使時間碎片連續(xù)

V8引擎

  • 主流的JavaScript執(zhí)行引擎
  • V8采用即時編譯
  • V8內存設限 (64位系統(tǒng)不超過 1.5G 21位系統(tǒng)不超過800M)

V8垃圾回收策略

  • 采用分代回收的思想
  • 內存分為新生代、老聲帶
  • 針對不同的對象采用不同算法

V8常見GC算法

  • 分代回收
  • 空間復制
  • 標記清除
  • 標記整理
  • 標記增量

V8 新生代對象回收

  • V8 內存空間一分為二
  • 小空間用于存儲新生代對象(64位32M | 32位16M)
  • 新生代對象指存活時間較短的對象
    例如:局部作用域的變量是新生代述寡, 全局變量存是老年代

新生代對象回收實現(xiàn)

  • 回收過程采用復制算法 + 標記整理
  • 新生代內存區(qū)分為兩個等大空間
  • 使用空間為From 狀態(tài)柿隙, 空閑空間為 To狀態(tài)
  • 活動對象存于From 空間
  • 等到回收階段,標記整理后會將活動對象拷貝到To
  • 釋放掉From
    細節(jié)說明
  • 拷貝過程中可能出現(xiàn)晉升
  • 晉升就是將新生代對象移動至老年代
  • 一輪GC還存活的新生代需要晉升
  • To 空間使用率超過25%,之后拷貝的對象則會晉升

V8 老年代對象回收

  • 老年代64位操作系統(tǒng)1.4G ,32位操作系統(tǒng)700m
  • 老年代活動對象指存活時間較長的對象

老年代對象回收實現(xiàn)

  • 主要采用標記清除鲫凶、標記整理禀崖、增量標記算法
  • 首先使用標記清除完成垃圾空間的回收(存在空間碎片)
  • 采用標記整理進行空間優(yōu)化(新生代晉升時,老年代區(qū)域不足以存放新生代對象)
  • 采用增量標記進行效率優(yōu)化

增量標記
程序執(zhí)行與標記間隔執(zhí)行螟炫,達到清理標準一起清理

細節(jié)對比

  • 新生代區(qū)域垃圾回收使用空間換時間
  • 老年代區(qū)域垃圾回收空間大波附,不適合復制算法
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市不恭,隨后出現(xiàn)的幾起案子叶雹,更是在濱河造成了極大的恐慌财饥,老刑警劉巖换吧,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異钥星,居然都是意外死亡沾瓦,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贯莺,“玉大人风喇,你說我怎么就攤上這事÷铺剑” “怎么了魂莫?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長爹耗。 經(jīng)常有香客問我耙考,道長,這世上最難降的妖魔是什么潭兽? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任倦始,我火速辦了婚禮,結果婚禮上山卦,老公的妹妹穿的比我還像新娘鞋邑。我一直安慰自己,他們只是感情好账蓉,可當我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布枚碗。 她就那樣靜靜地躺著,像睡著了一般剔猿。 火紅的嫁衣襯著肌膚如雪视译。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天归敬,我揣著相機與錄音酷含,去河邊找鬼。 笑死汪茧,一個胖子當著我的面吹牛椅亚,可吹牛的內容都是我干的。 我是一名探鬼主播舱污,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼呀舔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了扩灯?” 一聲冷哼從身側響起媚赖,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎珠插,沒想到半個月后惧磺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡捻撑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年磨隘,在試婚紗的時候發(fā)現(xiàn)自己被綠了缤底。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡番捂,死狀恐怖个唧,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情设预,我是刑警寧澤徙歼,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站鳖枕,受9級特大地震影響鲁沥,放射性物質發(fā)生泄漏。R本人自食惡果不足惜耕魄,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一画恰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吸奴,春花似錦允扇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至读处,卻和暖如春糊治,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背罚舱。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工井辜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人管闷。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓粥脚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親包个。 傳聞我的和親對象是個殘疾皇子刷允,可洞房花燭夜當晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內容