【读书笔记】《深入浅出nodejs》第五章 内存控制
海量請(qǐng)求+長(zhǎng)時(shí)間運(yùn)行 -> 內(nèi)存控制 -> 一切資源高效循環(huán)利用
1. V8的垃圾回收機(jī)制與內(nèi)存限制
在Node中通過(guò)JavaScript使用內(nèi)存時(shí),只能使用部分內(nèi)存(64位系統(tǒng)下約1.4GB,32位系統(tǒng)下約為0.7GB)。
在V8中,所有的JavaScript對(duì)象都是通過(guò)堆來(lái)進(jìn)行分配的,當(dāng)申請(qǐng)的堆空閑內(nèi)存不夠分配新的對(duì)象,將繼續(xù)申請(qǐng)堆內(nèi)存,直到堆得大小超過(guò)V8的限制為止。
為什么V8要限制堆得大小?
-> (1)V8最初為瀏覽器設(shè)計(jì),不太可能遇到用大量?jī)?nèi)存的場(chǎng)景。
-> (2)V8的垃圾回收機(jī)制限制。(1.5GB的垃圾回收堆內(nèi)存,需要大約50毫秒以上,這使得應(yīng)用性能和響應(yīng)能力會(huì)直線下降)
突破V8限制:
-> $node --max-old-space-size = 1700 (單位MB) or?
-> $node --max-new-space-size =1024 (單位KB)
V8的垃圾回收機(jī)制 ---- 分代式垃圾回收機(jī)制
查看垃圾回收機(jī)制 ---- $node --trace_gc -e "var a = [];for (var i=0; i<1000000; i++) a.push(new Array(100));" > gc.log
2. 高效使用內(nèi)存
(1)了解作用域
(2)了解閉包
無(wú)法立即回收的內(nèi)存有:
->閉包
->全局變量引用
因此,要小心此類變量的無(wú)限制添加
3. 內(nèi)存指標(biāo)
--會(huì)存在一些我們認(rèn)為會(huì)回收但是卻沒(méi)有被回收的對(duì)象,這會(huì)導(dǎo)致內(nèi)存占用無(wú)限增長(zhǎng)。一旦增長(zhǎng)達(dá)到V8內(nèi)存限制,將會(huì)得到內(nèi)存溢出錯(cuò)誤,進(jìn)而導(dǎo)致進(jìn)程退出。
(1)查看內(nèi)存使用情況 -> $node >process.memoryUsage() {
{
rss (resident set size 進(jìn)程的常駐內(nèi)存部分):132852672, (除此外,內(nèi)存其余部分在交換區(qū)(swap)或文件系統(tǒng)(filesystem)中)
? heapTotal(堆中總共申請(qǐng)的內(nèi)存量) :6131200,
? heapUsed(目前堆中使用中的內(nèi)存量):2757120,
}
(2)查看系統(tǒng)內(nèi)存占用
-> $node >os.totalmem() ?“系統(tǒng)的總內(nèi)存”
-> $node >os.freemem() “系統(tǒng)的閑置內(nèi)存”
(3)堆外內(nèi)存
受V8的垃圾回收限制的主要是V8的堆內(nèi)存。
4. 內(nèi)存泄漏
造成內(nèi)存泄漏的原因:
(1)緩存
(2)隊(duì)列消費(fèi)不及時(shí)
(3)作用域未釋放
5. 內(nèi)存泄漏排查
使用常見工具:
(1)node-heapdump
(2)node-memwatch
6. 大內(nèi)存應(yīng)用
?
轉(zhuǎn)載于:https://www.cnblogs.com/libinfs/p/5922447.html
總結(jié)
以上是生活随笔為你收集整理的【读书笔记】《深入浅出nodejs》第五章 内存控制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 以太坊智能合约Hello World示例
- 下一篇: 清北学堂十一培训酱油记