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