優(yōu)化你的內(nèi)存

這篇文章主要介紹 V8 的內(nèi)存管理和垃圾回收知識(shí)畴椰。(總結(jié)來自網(wǎng)易課堂)

V8引擎內(nèi)存回收機(jī)制

為什么我們要關(guān)注內(nèi)存呢臊诊?

  1. 防止頁面占用內(nèi)存過大,引起客戶端卡頓迅矛,甚至無響應(yīng)
  2. Node使用的也是V8妨猩,內(nèi)存對于后端服務(wù)的性能至關(guān)重要。因?yàn)榉?wù)的持久性秽褒,后端很容易造成內(nèi)存溢出壶硅。

V8內(nèi)存結(jié)構(gòu)

在 64 位的機(jī)器上,默認(rèn)最大操作的對象大小約為 1.4G销斟,在 32 位的機(jī)器上庐椒,默認(rèn)最大操作的對象大小約為 0.7G。
V8 將內(nèi)存分為兩類:新生代內(nèi)存空間和老生代內(nèi)存空間蚂踊,新生代內(nèi)存空間主要用來存放存活時(shí)間較短的對象约谈,老生代內(nèi)存空間主要用來存放存活時(shí)間較長的對象。 64位新生代的空間為64MB犁钟,老生代為1400MB棱诱。32位下新生代的空間為16MB,老生代為700MB涝动。

V8內(nèi)存結(jié)構(gòu)

新生代的變量迈勋,是一個(gè)復(fù)制的過程,假設(shè)有a,b,c三個(gè)變量醋粟,如果c不使用了靡菇,就會(huì)把From中的變量a、b復(fù)制到to里面米愿,然后把from里面全部清空厦凤。下一次,如果b死掉了育苟,再把a(bǔ)從to復(fù)制到from较鼓,然后把to清空。
老生代的回收违柏,是標(biāo)記死掉的變量博烂,在垃圾回收的時(shí)候拓哺,把死掉的變量全部清除掉,然后進(jìn)行磁盤碎片處理脖母。
標(biāo)記清除法主要分三步:

  1. 將所有的指針(變量名)和分配出去的內(nèi)存打上標(biāo)記。
  2. 從棧區(qū)開始查找所有可用的變量名闲孤,清除這些變量名的標(biāo)記谆级,并且清除它們指向的內(nèi)存的標(biāo)記。
  3. 標(biāo)記清除結(jié)束后讼积,回收所有仍然帶有標(biāo)記的內(nèi)存(說明沒有一個(gè)有效的變量名指向這塊內(nèi)存)肥照。


    image.png

新生代如何晉升到老生代。

必須要滿足2個(gè)條件:
1.變量必須要經(jīng)歷過回收(也就是復(fù)制)
2.To空間已經(jīng)占用了百分之25勤众。

利用node來查看內(nèi)存使用情況

通過process.memoryUsage()

查看V8引擎內(nèi)存

其中res是V8總內(nèi)存舆绎,heapTotal:是堆總內(nèi)存,heapUsed:是堆使用內(nèi)存们颜,external:是額外C++內(nèi)存吕朵。
我們重點(diǎn)關(guān)注一下heapUsed

V8引擎是如何處理變量

內(nèi)存主要是用來儲(chǔ)存變量等數(shù)據(jù),局部變量當(dāng)程序執(zhí)行結(jié)束窥突,且沒有引用的時(shí)候努溃,就會(huì)隨之消失。而全局變量會(huì)始終存貨到程序運(yùn)行結(jié)束阻问。

function getme(){
    var mem = process.memoryUsage();
    var format = function(bytes){
        return (bytes/1024/1024).toFixed(2)+'MB';
    };
    console.log('Process: heapTotal '+format(mem.heapTotal) + 
            ' heapUsed ' + format(mem.heapUsed) +
            ' rss ' + format(mem.res)
        );
}

上面這個(gè)函數(shù)可以在node環(huán)境中輸出V8內(nèi)存的使用情況梧税。

如何注意內(nèi)存的使用

優(yōu)化內(nèi)存的技巧

  1. 盡量不要定義全局變量
  2. 全局變量記得銷毀掉
    有兩種方式,第一種是delete称近,但是delete在嚴(yán)格模式下是禁止的第队。
    第二種,是將變量 = undefined 或者 變量 = null
  3. 用匿名自執(zhí)行函數(shù)變?nèi)譃榫植?/li>
  4. 盡量避免閉包

防止內(nèi)存泄漏

  1. 濫用緩存
  2. 大內(nèi)存量操作
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末刨秆,一起剝皮案震驚了整個(gè)濱河市凳谦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坛善,老刑警劉巖晾蜘,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異眠屎,居然都是意外死亡剔交,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門改衩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岖常,“玉大人,你說我怎么就攤上這事葫督〗甙埃” “怎么了板惑?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長偎快。 經(jīng)常有香客問我冯乘,道長,這世上最難降的妖魔是什么晒夹? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任裆馒,我火速辦了婚禮,結(jié)果婚禮上丐怯,老公的妹妹穿的比我還像新娘喷好。我一直安慰自己,他們只是感情好读跷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布梗搅。 她就那樣靜靜地躺著,像睡著了一般效览。 火紅的嫁衣襯著肌膚如雪无切。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天钦铺,我揣著相機(jī)與錄音订雾,去河邊找鬼。 笑死矛洞,一個(gè)胖子當(dāng)著我的面吹牛洼哎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沼本,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼噩峦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了抽兆?” 一聲冷哼從身側(cè)響起识补,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辫红,沒想到半個(gè)月后凭涂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贴妻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年切油,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片名惩。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡澎胡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情攻谁,我是刑警寧澤稚伍,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站戚宦,受9級(jí)特大地震影響个曙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜受楼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一困檩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧那槽,春花似錦、人聲如沸等舔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽慌植。三九已至甚牲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蝶柿,已是汗流浹背丈钙。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留交汤,地道東北人雏赦。 一個(gè)月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像芙扎,于是被迫代替她去往敵國和親星岗。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

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