国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

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

2024-05-06 15:34:17
字體:
供稿:網(wǎng)友

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

Nodejs是基于V8構(gòu)建的,所以在Node中使用的JavaScript對象基本上(Buffer就不是)都是通過V8來進行分配和管理的。V8在占用內(nèi)存大小上做了限制(64位操作系統(tǒng),單個Node進程可使用的最大堆內(nèi)存大小約為1.5GB)。即使服務(wù)器的內(nèi)存很大,但是由于V8的這種限制,導(dǎo)致Node無法充分利用服務(wù)器的資源。即便如此,為什么V8要做這樣的限制呢?做這樣限制的原因其實是與垃圾回收機制相關(guān),以1.5GB的垃圾回收堆內(nèi)存堆為例,V8做一次小的垃圾回收需要50ms以上,做一次全量的垃圾回收甚至要1s以上,要知道垃圾回收過程中JavaScript線程是要處于暫停執(zhí)行的狀態(tài),太長的暫行時間對于后端服務(wù)的性能是會產(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)存泄漏導(dǎo)致服務(wù)器一直頻繁重啟的時候,建議先調(diào)大堆內(nèi)存大小來為定位問題爭取時間,畢竟服務(wù)響應(yīng)慢總比直接返回錯誤頁對于用戶而言會更好接受一點。

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

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

新生代中的對象存活時間較短,而老生代中的對象存活時間較長甚至是常駐內(nèi)存。基于此所以設(shè)計的新生代的內(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之間進行復(fù)制。對于生命周期短的場景存活對象在整個對象中占比較小,所以Scavenge采用的是復(fù)制存活的對象,但是Scavenge只能利用堆內(nèi)存一半的空間,這是典型的用空間換時間的體現(xiàn)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 巨野县| 青阳县| 尖扎县| 肥城市| 醴陵市| 尉氏县| 阿坝县| 扶沟县| 常山县| 湖北省| 玉溪市| 富平县| 临夏县| 河间市| 甘孜| 松桃| 当阳市| 大兴区| 金川县| 密山市| 丰宁| 宣汉县| 伊金霍洛旗| 壤塘县| 衡水市| 从化市| 徐水县| 温州市| 衡东县| 梁平县| 民乐县| 且末县| 高台县| 黎川县| 乐平市| 延边| 平邑县| 泰来县| 洛宁县| 冷水江市| 望都县|