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