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为正数,则表示创建了闭包函数,如果多个快照中都没有变负数,则表示没有销毁闭包