最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Nodejs內(nèi)存治理

 更新時間:2018年05月13日 11:39:08   作者:xingyeqishi  
本篇文章給大家分享了Nodejs內(nèi)存處理相關的知識點以及實例代碼分享,有興趣的朋友跟著學習下。

s運行的宿主環(huán)境不同,相應的對內(nèi)存治理的要求也不一樣,當宿主環(huán)境是瀏覽器時,由于網(wǎng)頁的運行時間短,且只運行在用戶的機器上(相當于分布式),即使內(nèi)存使用過多或者存在一定的內(nèi)存泄漏,也并不會對終端用戶產(chǎn)生太大的影響。當宿主環(huán)境編程服務器(Node)時,情況就大不相同了,本身代碼運行在固定的幾臺機器(集中式)上,而且運行的時間是長時間運行,一旦內(nèi)存治理不好出現(xiàn)了內(nèi)存膨脹甚至是內(nèi)存泄漏的情況的話,就會出現(xiàn)服務器端響應時間變長甚至是服務crash的情況。

Nodejs是基于V8構建的,所以在Node中使用的JavaScript對象基本上(Buffer就不是)都是通過V8來進行分配和管理的。V8在占用內(nèi)存大小上做了限制(64位操作系統(tǒng),單個Node進程可使用的最大堆內(nèi)存大小約為1.5GB)。即使服務器的內(nèi)存很大,但是由于V8的這種限制,導致Node無法充分利用服務器的資源。即便如此,為什么V8要做這樣的限制呢?做這樣限制的原因其實是與垃圾回收機制相關,以1.5GB的垃圾回收堆內(nèi)存堆為例,V8做一次小的垃圾回收需要50ms以上,做一次全量的垃圾回收甚至要1s以上,要知道垃圾回收過程中JavaScript線程是要處于暫停執(zhí)行的狀態(tài),太長的暫行時間對于后端服務的性能是會產(chǎn)生較大影響的,所以出于這方面考慮,V8對堆內(nèi)存做了限制。即便如此,V8還是提供了可以自定義堆內(nèi)存大小的方式(--max-old-pace-size),old-space代表老生代、new-space代表新生代。

node --max-old-space-size=xxx index.js //單位為MB
// 之前還可以通過-max-new-space-size來定義新生代堆大小,現(xiàn)在已經(jīng)不可以了

當由于內(nèi)存泄漏導致服務器一直頻繁重啟的時候,建議先調(diào)大堆內(nèi)存大小來為定位問題爭取時間,畢竟服務響應慢總比直接返回錯誤頁對于用戶而言會更好接受一點。

為什么需要老生代和新生代?

老生代和新生代其實是分代式垃圾回收機制里面的不同的分代,因為沒有一種垃圾回收算法能夠勝任所有的場景,不同的對象生存周期其實需要不同的回收策略才能達到最好的效果,所以V8采用分代式垃圾回收機制,降對象按的存活時間進行不同的分代,然后對不同分代(新生代、老生代)的內(nèi)存施以更適合也更好的算法。

新生代中的對象存活時間較短,而老生代中的對象存活時間較長甚至是常駐內(nèi)存?;诖怂栽O計的新生代的內(nèi)存普遍要比老生代的內(nèi)存小很多,V8中新生代最大內(nèi)存是32M(64位系統(tǒng)為例),老生代最大內(nèi)存是1400MB。V8實際使用的堆內(nèi)存大小是新生代+老生代所用內(nèi)存之和(1432MB),但是V8最大值其實是比使用的內(nèi)存對大小額外大了32M(1464MB)

新生代如何做垃圾回收?

新生代的采用名叫Scavenge的垃圾回收算法。在Scavenge的具體實現(xiàn)中,主要采用了Cheney算法,Cheney算法通過將新生代堆一分為二,一個使用(From semispace),一個空閑(To semispace)。創(chuàng)建對象的時候,現(xiàn)在From空間中進行分配,當需要進行垃圾回收時,就檢查From空間中的存活對象,然后將存活的對象拷貝到To空間,同時清空From空間,并將From和To互換,整個垃圾回收過程中就是將存活對象在兩個seispace之間進行復制。對于生命周期短的場景存活對象在整個對象中占比較小,所以Scavenge采用的是復制存活的對象,但是Scavenge只能利用堆內(nèi)存一半的空間,這是典型的用空間換時間的體現(xiàn)。

當一個對象經(jīng)過多次垃圾回收依然存活的話,就會被認為是生命周期較長的對象,一方面新生代堆比較小,另一方面重復復制生命周期長的對象也很沒有效率,所以對于生命周期長的對象會被移到老生代中去。新生代對象移動到老生代有兩個對象:1.對象是否是生命周期較長的對象(已經(jīng)經(jīng)歷過垃圾回收)2.To空間使用占比是否超過了25%。限制25%的原因是由于垃圾回收完成后To會變成From,如果不做限制的話可能會出現(xiàn)From很快被用光的情況,出現(xiàn)頻繁的垃圾回收,也會影響效率。

老生代如何做垃圾回收?

老生代由于存活對象占較大比重,不適合對存活對象進行操作,使用Scavenge算法就不太合適了,因此老生代采用了Mark-Sweep和Mark-Compact相結合的方式。

Mark-Sweep分為標記和清除兩個階段,在標記階段遍歷堆中所有對象,標記活著的對象,然后在清除階段未被標記的對象將會被清除掉。Mark-Sweep解決了內(nèi)存釋放的問題但是由于沒有像Scavenge那樣復制對象的操作導致內(nèi)存碎片化不連續(xù)。而Mark-Compact就是用來解決內(nèi)存碎片化問題的。Mark-Compact會將存活的對象往一端移動,移動完成后直接清理掉邊界外的內(nèi)存,這樣就有大段的連續(xù)可用內(nèi)存了,但是由于涉及到對象的移動,因此Mark-Compact的速度要比Mark-Sweep慢了。V8主要使用Mark-Sweep,只有當空間不足以對新生代中今生過來的對象進行分配時才使用Mark-Compact。

垃圾回收過程中會導致應用程序暫停執(zhí)行,由于新生代本身空間較小,且要復制的存活對象占比也少,因此即便執(zhí)行全量垃圾回收也影響不大,但是老生代空間很大,存活對象也多,執(zhí)行一次全量垃圾回收對于應用程序暫停會是一個比較長的時間,因此V8將老生的標記改成了增量更新的方式,使得標記和應用程序交替執(zhí)行直到標記完成,然后垃圾回收再執(zhí)行后面的清理工作。注意清理工作并不是增量的。

開發(fā)者可以指定強制垃圾回收嗎?

答案是可以了,在啟動node服務的時候使用--expose-gc flag

$ node --expose-gc file.js

這樣全局對象上就有了執(zhí)行垃圾回收的函數(shù)

global.gc();

推薦更安全的寫法

function forceGC()
 if (global.gc) {
  global.gc();
 } else {
  console.warn('No GC hook! Start your program as `node --expose-gc file.js`.');
 }
}

最后給大家分享一下參考資料:

https://speakerdeck.com/addyosmani/javascript-memory-management-masterclass

http://www.fzitv.net/article/140005.htm

https://www.xarg.org/2016/06/forcing-garbage-collection-in-node-js-and-javascript/

相關文章

  • 微信小程序搭載node.js服務器的簡單教程

    微信小程序搭載node.js服務器的簡單教程

    小程序是一種全新的連接用戶與服務的方式,它可以在微信內(nèi)被便捷地獲取和傳播,同時具有出色的使用體驗,下面這篇文章主要給大家介紹了關于微信小程序搭載node.js服務器的簡單教程,需要的朋友可以參考下
    2022-12-12
  • Nodejs?連接?mysql時報Error:?Cannot?enqueue?Query?after?fatal?error錯誤的處理辦法

    Nodejs?連接?mysql時報Error:?Cannot?enqueue?Query?after?fa

    這篇文章主要介紹了Nodejs?連接?mysql時報Error:?Cannot?enqueue?Query?after?fatal?error錯誤的處理辦法,需要的朋友可以參考下
    2023-05-05
  • webstorm中配置nodejs環(huán)境及npm的實例

    webstorm中配置nodejs環(huán)境及npm的實例

    今天小編就為大家分享一篇webstorm中配置nodejs環(huán)境及npm的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Node.js中開發(fā)樹形結構接口的實現(xiàn)

    Node.js中開發(fā)樹形結構接口的實現(xiàn)

    本文介紹了Node.js中開發(fā)樹形結構接口的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-12-12
  • nodejs配置express服務器運行自動打開瀏覽器詳細步驟

    nodejs配置express服務器運行自動打開瀏覽器詳細步驟

    在nodejs中使用express來搭建框架可以說是非常的簡單方便,下面這篇文章主要給大家介紹了關于nodejs配置express服務器運行自動打開瀏覽器的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • Node.js中的CommonJS模塊化規(guī)范詳解

    Node.js中的CommonJS模塊化規(guī)范詳解

    這篇文章主要介紹了Node.js中的CommonJS模塊化規(guī)范,本文主要介紹了?CommonJS?規(guī)范在?Node?中的簡單應用,主要就是導入和導出模塊,需要的朋友可以參考下
    2023-02-02
  • npm與nrm兩種方式查看源和切換鏡像詳解

    npm與nrm兩種方式查看源和切換鏡像詳解

    nrm(npm registry manager )是npm的鏡像源管理工具,它可以快速在讓你在本地源之間切換,下面這篇文章主要給大家介紹了關于npm與nrm兩種方式查看源和切換鏡像的相關資料,需要的朋友可以參考下
    2023-02-02
  • Node版本升級和降級之node版本管理工具nvm詳解

    Node版本升級和降級之node版本管理工具nvm詳解

    nvm是管理node版本的工具,一個電腦中可以安裝多個node版本,當我們想使用哪個版本就切換成哪個版本,而nvm則是提供切換node版本的工具,這篇文章主要給大家介紹了關于Node版本升級和降級之node版本管理工具nvm的相關資料,需要的朋友可以參考下
    2022-08-08
  • 零基礎搭建Node.js、Express、Ejs、Mongodb服務器及應用開發(fā)入門

    零基礎搭建Node.js、Express、Ejs、Mongodb服務器及應用開發(fā)入門

    這篇文章主要介紹了零基礎搭建Node.js、Express、Ejs、Mongodb服務器及應用開發(fā)入門,本文在windows8系統(tǒng)下完成本教程,其它系統(tǒng)也可參考,需要的朋友可以參考下
    2014-12-12
  • Nodejs進階之服務端字符編解碼和亂碼處理

    Nodejs進階之服務端字符編解碼和亂碼處理

    這篇文章主要介紹了Nodejs進階之服務端字符編解碼和亂碼處理,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09

最新評論

高淳县| 侯马市| 黎城县| 洛浦县| 通榆县| 饶平县| 英超| 集安市| 鹰潭市| 岳阳市| 揭东县| 衡阳县| 尉氏县| 东山县| 枝江市| 资阳市| 武定县| 同德县| 吐鲁番市| 贡山| 北辰区| 石棉县| 苗栗县| 宕昌县| 吉隆县| 福泉市| 泸定县| 彭州市| 武冈市| 新宾| 浦北县| 额济纳旗| 普兰县| 化州市| 和平区| 浏阳市| 芷江| 桓台县| 达尔| 太仓市| 营山县|