JavaScript中的垃圾收集

  • 程序的運(yùn)行需要內(nèi)存焚廊。
  • javaScript使用自動內(nèi)存管理纵诞,這被稱為“垃圾回收機(jī)制”绘闷。
  • 優(yōu)點(diǎn)是可以簡化開發(fā)忆肾、節(jié)省代碼
  • 缺點(diǎn)是無法完整的掌握內(nèi)存的分配與回收的具體過程

NodeJS中的內(nèi)存管理

  • 網(wǎng)頁端的內(nèi)存泄露
  • 對于持續(xù)運(yùn)行的服務(wù)進(jìn)程N(yùn)ode服務(wù)器端程序室梅,必須及時釋放不再用到的內(nèi)存戏仓。否則內(nèi)存占用越來越高, 輕則影響系統(tǒng)性能亡鼠,重則導(dǎo)致進(jìn)程崩潰赏殃。
  • 如果不再用到的內(nèi)存沒有及時釋放,就叫做內(nèi)存泄露间涵。

V8內(nèi)存管理

1. v8內(nèi)存限制

  • 在62位操作系統(tǒng)可以使用1.4G內(nèi)存
  • 在32位操作系統(tǒng)中可以使用0.7G內(nèi)存

2. V8內(nèi)存管理

  • Js對象都是通過V8進(jìn)行分配管理內(nèi)存的

  • process.memoryUsage返回一個對象仁热,包含了Node進(jìn)程的內(nèi)存占用信息。

  • rss(resident set size):所有內(nèi)存占用勾哩, 包括指令區(qū)和堆棧抗蠢。

  • heapTotal: “堆”占用的內(nèi)存,包括用到的和沒用到的思劳。

  • heapUsed:用到的堆的部分迅矛,判斷內(nèi)存泄露,以heapUsed字段為準(zhǔn)潜叛。

  • external: V8引擎內(nèi)部的C++對象占用的內(nèi)存

3.為何限制內(nèi)存大小

  • 因?yàn)閂8的垃圾收集工作原理導(dǎo)致的秽褒,1.4G內(nèi)存完成一次垃圾收集需要1S以上
  • 這個暫停時間成為 stop the world, 在這個期間壶硅,應(yīng)用的性能和響應(yīng)能力都會下降。

4. 如何打開內(nèi)存內(nèi)存限制

  • 一旦初始化成功销斟, 生效后不能再修改
  • -max-new-space-size, 最大new space大小庐椒,執(zhí)行scavenge回收,默認(rèn)16M,單位KB
  • -max-old-space-size, 最大old space大小蚂踊,執(zhí)行MarkSweep回收约谈,默認(rèn)1M,單位MB

node --max-old-space-size=2000 單位是M

V8垃圾回收機(jī)制

  • V8是基于分代的垃圾回收。
  • 不同代的垃圾回收機(jī)制也不一樣
  • 按存活時間分為新生代和老生代

1. 分代

  • 年齡小的是新生代,由From區(qū)域和To區(qū)域兩個區(qū)域組成:
    在64位系統(tǒng)里悴势,新生代內(nèi)存是32M,From區(qū)域和To區(qū)域各占用16M
    在32位系統(tǒng)里窗宇,新生代內(nèi)存是16M,From區(qū)域和To區(qū)域各占用8M

  • 年齡大的是老生代,默認(rèn)情況下,
    64為系統(tǒng)下老生代內(nèi)存是1400M
    32為系統(tǒng)下老生代內(nèi)存是700M

分代示意圖

2. 引用計(jì)數(shù)

  • 語言引擎有一張引用表特纤,保存了內(nèi)存里面所有的資源的引用次數(shù)军俊。
  • 如果一個值的引用次數(shù)是0,就表示這個值不再用到了捧存,因此可以將這塊內(nèi)存釋放粪躬。

3,新生代垃圾回收

  • 新生代區(qū)域一分為二,每個16M昔穴,一個使用镰官,一個空閑
  • 開始垃圾回收的時候,會檢查FROM區(qū)域中的存活對象吗货,如果還活著泳唠,拷貝到TO空間,完成后釋 放空間
  • 完成后 FROM 和 TO 互換
  • 新生代掃描的時候是一種廣度優(yōu)先的掃描策略
  • 新生代的空間小宙搬,存活對象少
  • 當(dāng)一個對象經(jīng)歷過多次的垃圾回收依然存活的時候笨腥,生存周期比較長的對象會被移動到老生代, 這個移動過程被成為晉升或者升級:
    經(jīng)過5次以上的回收還存在
    TO的空間使用占比超過25%勇垛,或者超大對象



4.老生代

  • mark-sweep(標(biāo)記清除) mark-compact(標(biāo)記整理)
  • 老生代空間大脖母,大部分都是活著的對象,GC耗時比較長
  • 在GC期間無法響應(yīng),STOP-THE-WORLD
  • V8有一個優(yōu)化方案闲孤,增量處理谆级,把一個大暫停換成多個小暫停 INCREMENT-GC

mark-sweep(標(biāo)記清除)

  • 標(biāo)記活著的對象,隨后清除在標(biāo)記階段沒有標(biāo)記的對象讼积,只清理死亡對象
  • 問題在于清除后會出現(xiàn)內(nèi)存不連續(xù)的情況肥照,這種內(nèi)存碎片會對后續(xù)的內(nèi)存分配產(chǎn)生影響
  • 如果要分配一個大對象,碎片空間無法分配

mark-compact(標(biāo)記整理)

  • 標(biāo)記死亡后會對對象進(jìn)行整理勤众,活著的對象向左移動建峭,移動完成后直接清理掉邊界外的內(nèi)存

incremental marking 增量標(biāo)記

  • 以上三種回收時都需要暫停程序執(zhí)行,收集完成后才能恢復(fù)决摧, STOP-THE-WORLD 在新生代影響 不大亿蒸,但是老生代影響就非常大了
  • 增量標(biāo)記就是把標(biāo)記改為了增量標(biāo)記凑兰,把一口氣的停頓拆分成了多個小步驟,做完一步程序運(yùn)行 一會兒边锁,垃圾回收和應(yīng)用程序運(yùn)行交替進(jìn)行姑食,停頓時間可以減少到1/6左右 包括垃圾回收的占用時間
3種垃圾回收算法對比
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市茅坛,隨后出現(xiàn)的幾起案子音半,更是在濱河造成了極大的恐慌,老刑警劉巖贡蓖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件曹鸠,死亡現(xiàn)場離奇詭異,居然都是意外死亡斥铺,警方通過查閱死者的電腦和手機(jī)彻桃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晾蜘,“玉大人邻眷,你說我怎么就攤上這事√藿唬” “怎么了肆饶?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長岖常。 經(jīng)常有香客問我驯镊,道長,這世上最難降的妖魔是什么竭鞍? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任板惑,我火速辦了婚禮,結(jié)果婚禮上笼蛛,老公的妹妹穿的比我還像新娘洒放。我一直安慰自己蛉鹿,他們只是感情好滨砍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著妖异,像睡著了一般惋戏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上他膳,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天响逢,我揣著相機(jī)與錄音,去河邊找鬼棕孙。 笑死舔亭,一個胖子當(dāng)著我的面吹牛些膨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播钦铺,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼订雾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了矛洞?” 一聲冷哼從身側(cè)響起洼哎,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沼本,沒想到半個月后噩峦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抽兆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年识补,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片郊丛。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡李请,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出厉熟,到底是詐尸還是另有隱情导盅,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布揍瑟,位于F島的核電站白翻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏绢片。R本人自食惡果不足惜滤馍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望底循。 院中可真熱鬧巢株,春花似錦、人聲如沸熙涤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祠挫。三九已至那槽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間等舔,已是汗流浹背骚灸。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留慌植,地道東北人甚牲。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓义郑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親丈钙。 傳聞我的和親對象是個殘疾皇子魔慷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容

  • JavaScript具有自動垃圾回收機(jī)制,垃圾回收機(jī)制會按照固定的時間間隔周期性地執(zhí)行這一操作,垃圾回收機(jī)制必須跟...
    baiying閱讀 157評論 0 1
  • 一、引言 JavaScript具有自動垃圾收集機(jī)制著恩,即執(zhí)行環(huán)境會負(fù)責(zé)管理代碼執(zhí)行過程中使用的內(nèi)存院尔。 垃圾收集機(jī)制的...
    清兒阿閱讀 292評論 0 0
  • 1.哪些內(nèi)存需要回收 程序計(jì)數(shù)器,虛擬機(jī)棧喉誊,本地方法棧隨線程而生隨線程而滅邀摆。棧中棧幀隨著方法的調(diào)用與執(zhí)行完畢而入棧...
    sizuoyi00閱讀 483評論 0 1
  • JVM 垃圾回收器分類 新生代串行收集器 串行收集器主要有兩個特點(diǎn):第一,它僅僅使用單線程進(jìn)行垃圾回收伍茄;第二栋盹,它獨(dú)...
    AlanKim閱讀 1,183評論 0 1
  • 查看垃圾回收器: 我們知道JVM分Client 和 Server模式。如果啟動JVM不指定模式敷矫,JDK會根據(jù)當(dāng)前的...
    xuxw閱讀 449評論 0 0