一、概述
GoogleChrome浏览器提供了非常强大的JS调试工具,HeapProfiling便是其中一个。HeapProfiling可以记录当前的堆内存(heap)快照,并生成对象的描述文件,该描述文件给出了当时JS运行所用到的所有对象,以及这些对象所占用的内存大小、引用的层级关系等等。这些描述文件为内存泄漏的排查提供了非常有用的信息。
注意:本文里的所有例子均基于GoogleChrome浏览器。
什么是heap
JS运行的时候,会有栈内存(stack)和堆内存(heap),当我们用new实例化一个类的时候,这个new出来的对象就保存在heap里面,而这个对象的引用则存储在stack里。程序通过stack里的引用找到这个对象。例如vara=[1,,];,a是存储在stack里的引用,heap里存储着内容为[1,,]的Array对象。
二、HeapProfiling
打开工具
打开Chrome浏览器(版本5.0..15m),打开要监视的网站(这里以游戏大厅为例),按下F1调出调试工具,点击Profiles标签。可以看到下图:
可以看到,该面板可以监控CPU、CSS和内存,选中TakeHeapSnapshot,点击Start按钮,就可以拍下当前JS的heap快照,如下图所示:
右边视图列出了heap里的对象列表。由于游戏大厅使用了Quark游戏库,所以这里可以清楚地看到Quark.XXX之类的类名称(即Function对象的引用名称)。
注意:每次拍快照前,都会先自动执行一次GC,所以在视图里的对象都是可及的。
视图解释
列字段解释:
Constructor—类名Distance—估计是对象到根的引用层级距离ObjectsCount—给出了当前有多少个该类的对象ShallowSize—对象所占内存(不包含内部引用的其它对象所占的内存)(单位:字节)RetainedSize—对象所占总内存(包含内部引用的其它对象所占的内存)(单位:字节)
下面解释一下部分类名称所代表的意思:
(