1. 使用 performance monitor 實時查看內存變化
查看 JS Heap size 和 DOM Nodes的數量,如果持續升高,則表明內存泄漏
2. 使用 memory 面板分析內存變化
memory有3種方式,可以分析內存:
1. Heap snapshot - 用以打印堆快照,堆快照文件顯示頁面的 javascript 對象和相關 DOM 節點之間的內存分配
2. Allocation instrumentation on timeline - 在時間軸上記錄內存信息,隨着時間變化記錄內存信息。
3. Allocation sampling - 內存信息采樣,使用采樣的方法記錄內存分配。此配置文件類型具有最小的性能開銷,可用於長時間運行的操作。它提供了由 javascript 執行堆棧細分的良好近似值分配。
方法1:用Heap snapshot快照的方式
記錄幾次快照,比較前后的內存中,各個對象的數量變化,如果有大量該對象,或比對中,數量差異明顯,則可能存在泄漏。
重點分析該對象,可點開對應的代碼分析源碼。
方法2:用時間線收集
通過時間線快照,面板上面有藍線,表示內存占用,若持續出現,表示未被釋放。可以將范圍縮小到給藍線。查看下面的對象數量,若有對象的個數非常多,則表明該對象可能出現內存泄漏。
展開該對象,查看下面的對象,點擊對象,可定位到源碼。分析源碼,是否有內存泄漏。
3. 產生內存泄漏的幾種場景
1. 意外的全局變量 函數中意外的定義了全局變量,每次執行該函數都會生成該變量,且不會隨着函數執行結束而釋放。
2. 未清除的定時器 定時器沒有清除,它內部引用的變量,不會被釋放
3. 脫離DOM的元素引用 一個dom容器刪除之后,變量未置為null,則其內部的dom元素則不會釋放。通過Memory的快照,可以看到detached的dom元素,即為脫離dom的元素引用
4. 閉包引起內存泄漏
5. 持續綁定的事件 函數中addEventListener綁定事件,函數多次執行,綁定便會產生多次,產生內存泄漏。
