成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

javascript 垃圾回收算法

simon_chen / 2384人閱讀

摘要:它將堆內(nèi)存一分為二每一部分空間稱為。以的垃圾回收堆內(nèi)存為例做一次小的垃圾回收需要毫秒以上做一次非增量式的垃圾回收甚至要秒以上。這是垃圾回收中引起線程暫停執(zhí)行的時間在這樣的時間花銷下應(yīng)用的性能和響應(yīng)能力都會直線下降。

我們通常理解的 javascript 垃圾回收機(jī)制都停留在表面,"會釋放不被引用變量內(nèi)存",最近在讀《深入淺出node.js》的書,詳細(xì)了解了下 v8 垃圾回收的算法,記錄了一些學(xué)習(xí)筆記。
敲黑板:v8引擎的垃圾回收算法

V8的垃圾回收策略主要基于分代式垃圾回收機(jī)制,現(xiàn)代的垃圾回收算法中按對象的存活時間將內(nèi)存的垃圾回收進(jìn)行不同的分代,然后分別對不同分代的內(nèi)存施以更高效的算法。在V8中,主要將內(nèi)存分為新生代和老生代兩代。新生代中的對象為存活時間較短的對象, 老生代中的對象為存活時間較長或常駐內(nèi)存的對象。

Scavenge算法
在分代的基礎(chǔ)上,新生代中的對象主要通過Scavenge算法進(jìn)行垃圾回收,在Scavenge的具體 實現(xiàn)中,主要采用了Cheney算法

Cheney 算法是一種采用復(fù)制的方式實現(xiàn)的垃圾回收算法。它將堆內(nèi)存一分為二,每一部分空間稱為 semispace。在這兩個 semispace 空間中,只有一個處于使用中,另一個處于閑置狀態(tài)。處于使用狀態(tài)的 semispace 空間稱為 From 空間,處于閑置狀態(tài)的空間稱為 To 空間。當(dāng)我們分配對象時,先是在 From 空間中進(jìn)行分配。當(dāng)開始進(jìn)行垃圾回收時,會檢查 From 空間中的存活對象,這 些存活對象將被復(fù)制到 To 空間中,而非存活對象占用的空間將會被釋放。完成復(fù)制后,From 空 間和To空間的角色發(fā)生對換。 簡而言之, 在垃圾回收的過程中, 就是通過將存活對象在兩個 semispace 空間之間進(jìn)行復(fù)制。

Mark-Sweep & Mark-Compact
Scavenge算法通過犧牲空間換時間的算法非常適合生命周期短的新生代,但是,當(dāng)一個對象經(jīng)過多次復(fù)制,生命周期較長的時候或則To空間不足的時候,對象會被分配到進(jìn)入到老生代中,需要采用新的算法進(jìn)行垃圾回收。

Mark-Sweep 并不將內(nèi)存空間劃分為兩半,所以不存在浪費一半空間的行為。與 Scavenge 復(fù)制活著的對象不同, Mark-Sweep 在標(biāo)記階段遍歷堆中的所有對象,并標(biāo)記活著的對象,在隨后的清除階段中,只清除沒有被標(biāo)記的對象??梢钥闯?Scavenge 中只復(fù)制活著的對象,而 Mark-Sweep 只清理死亡對象。

Mark-Sweep 在進(jìn)行一次標(biāo)記清除回收后,內(nèi)存空間會出現(xiàn)不連續(xù)的狀態(tài)。這種內(nèi)存碎片會對后續(xù)的內(nèi)存分配造成問題,因為很可能出現(xiàn)需要分配一個大對象的情況,這時所有的碎片空間都無法完成此次分配,就會提前觸發(fā)垃圾回收,而這次回收是不必要的。Mark-Compact 對象在標(biāo)記為死亡后,在整理的過程中,將活著的對象往一端移動,移動完成后,直接清理掉邊界外的內(nèi)存

增量標(biāo)記

為了避免出現(xiàn) JavaScript 應(yīng)用邏輯與垃圾回收器看到的不一致的情況,垃圾回收的 3 種基本算法都需要將應(yīng)用邏輯暫停下來,待執(zhí)行完垃圾回收后再恢復(fù)執(zhí)行應(yīng)用邏輯,這種行為被稱為“全停頓",長時間的"全停頓"垃圾回收會讓用戶感受到明顯的卡頓,帶來體驗的影響。以1.5 GB的垃圾回收堆內(nèi)存為例,V8做一次小的垃圾回收需要50毫秒以上,做一次非增量式的垃圾回收甚至要1秒以上。這是垃圾回收中引起JavaScript線程暫停執(zhí)行的時間,在 這樣的時間花銷下,應(yīng)用的性能和響應(yīng)能力都會直線下降。

為了降低全堆垃圾回收帶來的停頓時間,V8先從標(biāo)記階段入手,將原本要一口氣停頓完成的動作改為增量標(biāo)記(incremental marking),也就是拆分為許多小“步進(jìn)”,每做完一“步進(jìn)” 就讓 JavaScript 應(yīng)用邏輯執(zhí)行一小會兒,垃圾回收與應(yīng)用邏輯交替執(zhí)行直到標(biāo)記階段完成

擴(kuò)展閱讀

JavaScript 內(nèi)存泄漏教程

精讀《深入淺出Node.js》

《深入淺出Node.js》PDF

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/95403.html

相關(guān)文章

  • JavaScript深入淺出第3課:什么是垃圾回收算法?

    摘要:摘要是如何回收內(nèi)存的深入淺出系列深入淺出第課箭頭函數(shù)中的究竟是什么鬼深入淺出第課函數(shù)是一等公民是什么意思呢深入淺出第課什么是垃圾回收算法最近垃圾回收這個話題非常火,大家不能隨隨便便的扔垃圾了,還得先分類,這樣方便對垃圾進(jìn)行回收再利用。 摘要: JS是如何回收內(nèi)存的? 《JavaScript深入淺出》系列: JavaScript深入淺出第1課:箭頭函數(shù)中的this究竟是什么鬼? Jav...

    AaronYuan 評論0 收藏0
  • javascript垃圾回收機(jī)制和內(nèi)存管理

    摘要:另一種垃圾收集算法是引用計數(shù),這種算法的思想是跟蹤記錄所有值被引用的次數(shù)。當(dāng)代碼中存在循環(huán)引用現(xiàn)象時,引用計數(shù)算法就會導(dǎo)致問題。 垃圾回收 javascript不同于c、c++的一個特點是:具有自動的垃圾回收機(jī)制,這就意味著,開發(fā)人員可以專注于業(yè)務(wù),而不必把過多精力放在內(nèi)存的管理上,提高開發(fā)效率。 所謂的垃圾回收就是找出那些不再繼續(xù)使用的變量,然后釋放其占用的內(nèi)存。為此,垃圾收集器...

    googollee 評論0 收藏0
  • javascript垃圾回收機(jī)制和內(nèi)存管理

    摘要:另一種垃圾收集算法是引用計數(shù),這種算法的思想是跟蹤記錄所有值被引用的次數(shù)。當(dāng)代碼中存在循環(huán)引用現(xiàn)象時,引用計數(shù)算法就會導(dǎo)致問題。 垃圾回收 javascript不同于c、c++的一個特點是:具有自動的垃圾回收機(jī)制,這就意味著,開發(fā)人員可以專注于業(yè)務(wù),而不必把過多精力放在內(nèi)存的管理上,提高開發(fā)效率。 所謂的垃圾回收就是找出那些不再繼續(xù)使用的變量,然后釋放其占用的內(nèi)存。為此,垃圾收集器...

    klivitamJ 評論0 收藏0
  • 詳細(xì)解說JavaScript內(nèi)存管理和GC算法

      JavaScript在創(chuàng)建變量(數(shù)組、字符串、對象等)是自動進(jìn)行了分配內(nèi)存,而且當(dāng)它沒有被使用的狀態(tài)下,會自動的釋放分配的內(nèi)容;其實這樣基層語言,如C語言,他們提供了內(nèi)存管理的接口,比如malloc()用于分配所需的內(nèi)存空間、free()釋放之前所分配的內(nèi)存空間?! ♂尫艃?nèi)存的過程稱為垃圾回收,例如avaScript這類高級語言可以提供了內(nèi)存自動分配和自動回收,其實這個自動儲存不會占用太多空間...

    3403771864 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<