什麼是記憶體洩漏?
程式執行需要記憶體。只要程式提出要求,作業系統或者執行時就必須供給記憶體。
對於持續執行的服務程式,必須及時釋放不再用到的記憶體。否則,記憶體佔用越來越高,輕則影響系統效能,重則導致程式崩潰。
垃圾回收機制
所謂的垃圾回收機制,就是通過變數的引用次數來決定是否回收。
如果一個值的引用次數為0,就表示不再用到,這個值就會被垃圾回收機制找到回收並釋放
例: var arr = [1,2,3,4];
arr = null; //當變數賦值為null時,引用次數為0
記憶體洩漏識別方法
怎樣可以觀察到記憶體洩漏呢?
如果連續五次垃圾回收之後,記憶體佔用一次比一次大,就有記憶體洩漏。這就要求實時檢視記憶體佔用
Chrome遊覽器
操作步驟:
1. 開啟開發者工具,選擇Performance皮膚
2. 點選勾選Memory,點選錄製按鈕(或Ctrl+E)
3. 在頁面上模擬使用者操作
4. 操作完成後點選Stop(Ctrl+E)完成錄製
如果記憶體佔用基本平穩,接近水平,說明不存在記憶體洩漏。
反之,記憶體波動差距較大就是記憶體洩漏
使用Node命令
使用Node提供process.memoryUsage()方法返回一個物件,包含Node程式的記憶體佔用資訊,該物件包含四個欄位。
1.res(resident set size):所有記憶體佔用,包括指令區和堆疊
2.heapTotal: “堆”佔用的記憶體,包括用到的和沒用到的
3.heapUsed: 用到的堆的部分,判斷記憶體洩漏以該欄位為準
4.external: V8 引擎內部的C++物件佔用的記憶體