nodeJs之內(nèi)存管理

在一般的后端語言中线罕,基本的內(nèi)存使用上基本沒有什么限制钞楼,但是在nodeJs中卻只能使用部分內(nèi)存询件。在64位系統(tǒng)下位約為1.4G唆樊,在32位系統(tǒng)下約為0.7G,造成這個(gè)問題的主要原因是因?yàn)閚odeJs基于V8構(gòu)建嘿辟,V8使用自己的方式來管理和分配內(nèi)存片效,這一套管理方式在瀏覽器端使用綽綽有余,但是在nodeJs中這卻限制了開發(fā)者昙读,在應(yīng)用中如果碰到了這個(gè)限制舌缤,就會(huì)造成進(jìn)程退出。

戴著腳銬跳舞

在服務(wù)端陵吸,假如將一個(gè)2G的文本文件讀到內(nèi)存中介牙,node進(jìn)程就會(huì)進(jìn)程崩潰,雖然這種情況不常見囚似,但是開發(fā)時(shí)候也只能小心翼翼线得,該如何解決呢?

暴力加內(nèi)存

在啟動(dòng)node進(jìn)程的時(shí)候募狂,可以調(diào)整內(nèi)存大小角雷。

node --max-old-space-size=1700 test.js // 單位為MB
node --max-new-space-size=1024 test.js // 單位為KB

這個(gè)在初始化進(jìn)程的時(shí)候就生效勺三,而且不能動(dòng)態(tài)擴(kuò)容,一般用來擴(kuò)充內(nèi)存祈远,以免稍微多一些內(nèi)存就崩潰商源。

合理利用內(nèi)存

V8限制內(nèi)存用量,主要是因?yàn)閂8垃圾回收機(jī)制的設(shè)計(jì)躬充。也正是因?yàn)槔厥諜C(jī)制讨便,我們才不需要像c++那樣手動(dòng)回收。

在V8中伴找,JavaScript的對(duì)象是分配在堆內(nèi)存中废菱,使用process.memoryUsage()可以查看當(dāng)前內(nèi)存使用狀態(tài)《队現(xiàn)在內(nèi)存有了最大的限制袒炉,那么我們寫代碼的時(shí)候就要額外注意了樊零,要避免濫用內(nèi)存。

1.及時(shí)釋放全局變量

global.a = {name: 'a object'};
console.log(global.a); // 全局變量不會(huì)再用到
global.a = undefined; //釋放該對(duì)象
  1. 合理使用閉包夺艰,及時(shí)釋放閉包函數(shù)的引用郁副。

在啟動(dòng)node進(jìn)程時(shí)帶上--trace_gc會(huì)在V8進(jìn)行垃圾回收的時(shí)候打印日志豌习,可以幫助我們觀察程序內(nèi)部垃圾回收的情況。

內(nèi)存泄漏

內(nèi)存泄漏的實(shí)質(zhì)就是應(yīng)該被垃圾回收的對(duì)象出現(xiàn)意外愕贡,沒有被回收巷屿,變成常駐于內(nèi)存中的對(duì)象。

通常造成內(nèi)存泄漏的原因有如下幾個(gè):

  1. 使用內(nèi)存進(jìn)行緩存

  2. 隊(duì)列消費(fèi)不及時(shí)

  3. 作用域未釋放

謹(jǐn)慎使用緩存

緩存和之前說的全局變量其實(shí)是一回事憨琳,平時(shí)前端JavaScript使用緩存的場景可能是因?yàn)閍pi請求慢旬昭,于是聲明一個(gè)全局變量來緩存數(shù)據(jù),如果有緩存就不用再發(fā)請求了遍略,節(jié)約了時(shí)間骤坐。但是在nodeJs中,緩存并非物美價(jià)廉蕾久。

lodash的memoize方法僧著,提供了一種緩存策略,利用一個(gè)map的鍵值對(duì)來緩存數(shù)據(jù)

function memoize(func, resolver) {
  if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
    throw new TypeError('Expected a function')
  }
  const memoized = function(...args) {
    const key = resolver ? resolver.apply(this, args) : args[0]
    const cache = memoized.cache

    if (cache.has(key)) {
      return cache.get(key)
    }
    const result = func.apply(this, args)
    memoized.cache = cache.set(key, result) || cache
    return result
  }
  memoized.cache = new (memoize.Cache || MapCache)
  return memoized
}

這種方法如果不做限制盹愚,或?qū)е戮彺鎸?duì)象過大,一直占用在內(nèi)存中霞篡,使用需謹(jǐn)慎端逼。

關(guān)注隊(duì)列

node底層的事件循環(huán)污淋,會(huì)不停查看是否有事件待處理,如果有的話礁鲁,就取出事件以及相關(guān)回調(diào)函數(shù)赁豆,如果有回調(diào)函數(shù)則執(zhí)行。

事件循環(huán)一個(gè)典型的生產(chǎn)者/消費(fèi)者的形式析二,異步I/O是事件的生產(chǎn)者叶摄,事件循環(huán)就是消費(fèi)者。大部分時(shí)候消費(fèi)速度都是大于生產(chǎn)速度的蛤吓,但當(dāng)生產(chǎn)速度大于消費(fèi)速度的時(shí)候会傲,事件會(huì)產(chǎn)生堆積拙泽,回調(diào)函數(shù)中的作用域不會(huì)得到釋放,于是產(chǎn)生了內(nèi)存泄漏奔滑。

例如現(xiàn)在往數(shù)據(jù)庫插入100W條數(shù)據(jù)朋其,數(shù)據(jù)庫建立在文件系統(tǒng)之上脆炎,寫數(shù)據(jù)效率很慢秒裕,很容易產(chǎn)生過多事件等待處理,這時(shí)候內(nèi)存泄漏就無法避免了几蜻。

解決方案:

  1. 監(jiān)控隊(duì)列長度

  2. 為異步請求加上超時(shí)機(jī)制梭稚。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末絮吵,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子暇昂,更是在濱河造成了極大的恐慌伴嗡,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澄暮,死亡現(xiàn)場離奇詭異赏寇,居然都是意外死亡价认,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門渠退,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碎乃,“玉大人惠奸,你說我怎么就攤上這事。” “怎么了嵌言?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵摧茴,是天一觀的道長埂陆。 經(jīng)常有香客問我,道長购裙,這世上最難降的妖魔是什么著摔? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任谍咆,我火速辦了婚禮私股,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘供嚎。我一直安慰自己,他們只是感情好克滴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布劝赔。 她就那樣靜靜地躺著,像睡著了一般着帽。 火紅的嫁衣襯著肌膚如雪移层。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天予借,我揣著相機(jī)與錄音,去河邊找鬼喧笔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛书闸,可吹牛的內(nèi)容都是我干的利凑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼牌借,長吁一口氣:“原來是場噩夢啊……” “哼割按!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起现柠,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤够吩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后周循,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體万俗,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闰歪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了课竣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡公条,死狀恐怖靶橱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情传黄,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布膘掰,位于F島的核電站识埋,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏窒舟。R本人自食惡果不足惜诵盼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望洁墙。 院中可真熱鬧杀糯,春花似錦苍苞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至凑耻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間类缤,已是汗流浹背邻吭。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瓢谢。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓氓扛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親幢尚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

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

  • 前言 因?yàn)閚ode絕大多數(shù)時(shí)間都是運(yùn)行在后端的服務(wù)器程序尉剩,因此理茎,需要精確控制內(nèi)存。在以前皂林,js程序員不需要控制內(nèi)存...
    白昔月閱讀 5,655評(píng)論 5 11
  • 原文鏈接:BlueSun | NodeJS中被忽略的內(nèi)存 如樸靈說過础倍,Node對(duì)內(nèi)存泄露十分敏感胎挎,一旦線上應(yīng)用有成...
    JC_Huang閱讀 11,151評(píng)論 4 5
  • 隨/奶泡 走在去醫(yī)院的路上,太陽烈的有些扎眼犹菇,但這并沒有影響我的心情。 作為一名醫(yī)生胳搞,一瞬間可以很驕傲称杨,一瞬間可以...
    奶泡有點(diǎn)甜閱讀 327評(píng)論 0 1
  • 本文由幣乎社區(qū)(bihu.com)內(nèi)容支持計(jì)劃贊助 不管你有沒有關(guān)注數(shù)字貨幣姑原,只要你平時(shí)看新聞,“比特幣”一定出現(xiàn)...
    Running悠閱讀 1,465評(píng)論 0 0
  • 劉娜 焦點(diǎn)解決網(wǎng)絡(luò)初級(jí)九期 駐馬店 2018~03~06 堅(jiān)持分享第10天 今天抽空看看書摊滔,有關(guān)太極圖的啟發(fā)摘錄如...
    洋帆起航閱讀 325評(píng)論 0 0