1. 程式人生 > >JS記憶體洩露排查方法

JS記憶體洩露排查方法

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為正數,則表示建立了閉包函式,如果多個快照中都沒有變負數,則表示沒有銷燬閉包