JS記憶體洩露排查方法
阿新 • • 發佈:2019-01-23
1、使用工具Heap Profiling
①、Heap Profiling可以記錄當前的堆記憶體(heap)的快照,並生成物件的描述檔案,該描述檔案給出了當時JS執行所用的所有物件,以及這些物件所佔用的記憶體大小、引用的層級關係等等。
②、JS執行的時候,會有棧記憶體(stack)和堆記憶體(heap),當我們new一個類的時候,這個new出來的物件就儲存在heap裡,而這個物件的引用則儲存在stack裡。程式通過stack的引用找到這個物件。例如:var a = [1,2,3],a是儲存在stack中的引用,heap裡儲存著內容為[1,2,3]的Array物件。
③、開啟除錯工具,點選Memory中的Profiles標籤,選中“Take Heap Snapshot”,點選“start”按鈕,就可以拍在當前JS的heap快照了。
右邊檢視中列出了heap裡的物件列表。
- constructor:類名
- Distance:物件到根的引用層級距離
- Objects Count:該類的物件數
- Shallow Size:物件所佔記憶體(不包含內部引用的其他物件所佔的記憶體)
- Retained Size:物件所佔的總記憶體(包含····················································)
點選上圖左上角的黑圈圈,會出現第二個記憶體快照
2、記憶體洩露的排查
將上圖框框切換到comparison(對照)選項,該檢視列出了當前檢視與上一個檢視的物件差異
- #New:新建了多少物件
- #Deleted:回收了多少物件
- #Delta:新建的物件個數減去回收的物件個數
重點看closure(閉包),如果#Delta為正數,則表示建立了閉包函式,如果多個快照中都沒有變負數,則表示沒有銷燬閉包