nodejs的内存管理,垃圾回收机制
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
要點(diǎn)記錄:
1、網(wǎng)頁(yè)js、命令行工具,快進(jìn)快出的,即時(shí)內(nèi)存泄露,無(wú)內(nèi)存管理必要!
2、服務(wù)器端nodejs和其他正規(guī)語(yǔ)言一樣存在內(nèi)存泄露。
3、nodejs基于谷歌v8js引擎,速度很快,垃圾回收也是由v8維護(hù)的
4、通過(guò)查看源碼可發(fā)現(xiàn)v8中用js使用內(nèi)存的限制約為:64位-1.4G ?32位 -0.7G。這是源于v8的垃圾回收機(jī)制的限制,可在node 后加 --max-old|new-space-size=xxx來(lái)改變內(nèi)存限制
5、nodejs進(jìn)程的內(nèi)存占用:堆內(nèi)內(nèi)存+堆外內(nèi)存=rss+swap+fs,
其中v8申請(qǐng)和分配的為堆內(nèi)內(nèi)存,所有js實(shí)體都是通過(guò)堆來(lái)分配的。process.memoryUsage() 可查看常駐內(nèi)存rss,heapTotal總堆內(nèi)存,和已分配的堆內(nèi)存heapUsed
非V8分配的內(nèi)存為堆外內(nèi)存,如 Buffer對(duì)象占據(jù)的內(nèi)存,用在網(wǎng)絡(luò)流和文件流中
os.totalmem ?os.freemem 可查看系統(tǒng)的總內(nèi)存和可用 內(nèi)存
6、v8的垃圾回收算法
統(tǒng)計(jì)學(xué)知識(shí)的應(yīng)用,按對(duì)象存活時(shí)間將內(nèi)存的垃圾回收進(jìn)行不同的分代,對(duì)這些不同的分代分別實(shí)施不同的回收算法
v8中將內(nèi)存主分為新生代 和 老生代 空間,前者存活時(shí)間短,后者較長(zhǎng)或常駐
7、新生代中活對(duì)象較少,采用scavenge-cheney算法:將新生代一分為二,From ->To ,新對(duì)象分配在from中,回收時(shí)將From中活的對(duì)象從From復(fù)制到To,釋放From,然后From和To互換角色。
8、一個(gè)對(duì)象從From復(fù)制到To時(shí),如果ta之前經(jīng)歷過(guò)一次scavenge復(fù)制,或者to空間已經(jīng)使用了25%了,則該對(duì)象會(huì)直接晉升到老生代空間中,接受其他回收算法
9、老生代活對(duì)象較多,采用mark-sweep和mark-compact相結(jié)合的方法:m-s,不再劃分內(nèi)存空間,標(biāo)記階段標(biāo)記所有活的對(duì)象,清理階段清除釋放所有未標(biāo)記(死了的)對(duì)象,這一步會(huì)產(chǎn)生內(nèi)存空間碎片,因此出現(xiàn)了m-c,邊標(biāo)記邊將活動(dòng)的對(duì)象往內(nèi)存空間的一端 移動(dòng),清理時(shí)直接清理活死對(duì)象邊界死的那端。移動(dòng)對(duì)象是耗時(shí)的,所以主要使用 m-s算法,當(dāng)不足以分配空間給從新生代晉升來(lái)的對(duì)象時(shí),才使用m-c回收。
10、全停頓---每次垃圾回收時(shí)都會(huì)暫停應(yīng)用邏輯,是為了避免應(yīng)用邏輯和回收器看到的對(duì)象不一致。
11、增量動(dòng)作,v8的分代垃圾回收中,分為full和part方式,part只回收新生代的,因?yàn)樾律臻g小啊,全停頓影響不大,但是full回收會(huì)回收老生代的,全停頓的時(shí)間就不能接受了,于是就有了 增量式標(biāo)記incremental marking。即將標(biāo)記工作分步,每步和應(yīng)用邏輯交替執(zhí)行,這樣最大停頓時(shí)間減少很多,(六分之一);
其他階段就有:延遲清理,增量式整理compact,利用多核來(lái)并行標(biāo)記和清理
12、查看垃圾回收動(dòng)作日志:啟動(dòng)node時(shí) 加 --trace_gc 參數(shù), --prof參數(shù)可得到v8執(zhí)行性能參數(shù),用*-tick-processor查看
13、無(wú)法立即回收的內(nèi)存有全局變量和閉包,盡量使用變量賦值為null|undefined來(lái)觸發(fā)回收
14、內(nèi)存泄露:該回收的對(duì)象出現(xiàn)意外沒(méi)有被回收,來(lái)自于:緩存,隊(duì)列消費(fèi)不及時(shí),作用域未釋放
15、慎用內(nèi)存當(dāng)緩存,非用的話控制好緩存的大小和過(guò)期時(shí)間,方式出現(xiàn)永遠(yuǎn)無(wú)法釋放的問(wèn)題,采用redis,memX
16、數(shù)組、回調(diào),生產(chǎn)者的速度比消費(fèi)者速度快,堆積了大量生產(chǎn)者導(dǎo)致無(wú)法釋放作用域或變量: 隊(duì)列監(jiān)控,異步調(diào)用應(yīng)包含超時(shí)處理機(jī)制
17、內(nèi)存泄露排查,網(wǎng)上搜索node應(yīng)用內(nèi)存查看分析工具
node-headdump
node-memwatch
18、大文件處理使用stream模塊
轉(zhuǎn)載于:https://my.oschina.net/jingxing05/blog/270248
總結(jié)
以上是生活随笔為你收集整理的nodejs的内存管理,垃圾回收机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【预测模型-ELAMN预测】基于遗传算法
- 下一篇: 树莓派基础实验13:雨滴探测传感器实验