• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    怎樣使用Nodejs內存治理

    來源:懂視網 責編:小采 時間:2020-11-27 19:44:10
    文檔

    怎樣使用Nodejs內存治理

    怎樣使用Nodejs內存治理:這次給大家帶來怎樣使用Nodejs內存治理,使用Nodejs內存治理的注意事項有哪些,下面就是實戰案例,一起來看一下。運行的宿主環境不同,相應的對內存治理的要求也不一樣,當宿主環境是瀏覽器時,由于網頁的運行時間短,且只運行在用戶的機器上(相當于分布式)
    推薦度:
    導讀怎樣使用Nodejs內存治理:這次給大家帶來怎樣使用Nodejs內存治理,使用Nodejs內存治理的注意事項有哪些,下面就是實戰案例,一起來看一下。運行的宿主環境不同,相應的對內存治理的要求也不一樣,當宿主環境是瀏覽器時,由于網頁的運行時間短,且只運行在用戶的機器上(相當于分布式)

    這次給大家帶來怎樣使用Nodejs內存治理,使用Nodejs內存治理的注意事項有哪些,下面就是實戰案例,一起來看一下。

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

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

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

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

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

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

    新生代中的對象存活時間較短,而老生代中的對象存活時間較長甚至是常駐內存。基于此所以設計的新生代的內存普遍要比老生代的內存小很多,V8中新生代最大內存是32M(64位系統為例),老生代最大內存是1400MB。V8實際使用的堆內存大小是新生代+老生代所用內存之和(1432MB),但是V8最大值其實是比使用的內存對大小額外大了32M(1464MB)

    新生代如何做垃圾回收?

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

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

    老生代如何做垃圾回收?

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

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

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

    開發者可以指定強制垃圾回收嗎?

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

    $ node --expose-gc file.js

    這樣全局對象上就有了執行垃圾回收的函數

    global.gc();

    推薦更安全的寫法

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

    相信看了本文案例你已經掌握了方法,更多精彩請關注Gxl網其它相關文章!

    推薦閱讀:

    怎樣使用Vue頁面骨架屏注入

    怎樣使用vscode調試編譯js代碼

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    怎樣使用Nodejs內存治理

    怎樣使用Nodejs內存治理:這次給大家帶來怎樣使用Nodejs內存治理,使用Nodejs內存治理的注意事項有哪些,下面就是實戰案例,一起來看一下。運行的宿主環境不同,相應的對內存治理的要求也不一樣,當宿主環境是瀏覽器時,由于網頁的運行時間短,且只運行在用戶的機器上(相當于分布式)
    推薦度:
    標簽: 內存 js 內存使用
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 99麻豆久久久国产精品免费| 精品免费视在线观看| 欧美肥屁VIDEOSSEX精品| 99久久综合国产精品二区| 日本aⅴ精品中文字幕| 国内精品免费久久影院| 国产精品爽黄69天堂a| 亚洲精品卡2卡3卡4卡5卡区| 麻豆国产高清精品国在线| 亚洲精品高清视频| 99re久久精品国产首页2020| 宅男在线国产精品无码| 精品国产一区二区三区2021| 欧美日韩在线亚洲国产精品| 国产精品美脚玉足脚交欧美| 亚洲国产精品va在线播放| 日韩一区二区精品观看| 久久久精品国产Sm最大网站| 99久久精品国产毛片| 国产精品岛国久久久久| 国产suv精品一区二区33| 久久精品中文闷骚内射| 日韩一区精品视频一区二区| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 亚洲一日韩欧美中文字幕欧美日韩在线精品一区二 | 丰满人妻熟妇乱又伦精品劲| 精品久久一区二区三区| 国产精品素人搭讪在线播放| 日韩精品久久久久久免费| 精品久久久久久无码免费| 69SEX久久精品国产麻豆| 久久精品国产亚洲AV无码娇色| 在线精品亚洲一区二区小说| 自拍偷自拍亚洲精品情侣| 亚洲人成电影网站国产精品| 夜夜精品无码一区二区三区| 亚洲精品线路一在线观看| 亚洲精品专区| 真实国产乱子伦精品视频| 日韩精品国产另类专区| 久久99精品久久久久子伦|