在使用jQuery的时候不小心的内存泄漏
在写chart widget的时候,我们使用了第三方的svg类库Raphael。结果客户给我们报了一个内存泄漏的bug,我们在测试的时候确实存在内存泄漏。经过测试发现了问题的原因。Raphael本身存在一些问题,还有就是在和jQuery使用的时候,我们也没有注意到一个问题。
在创建jQuery对象的时候,jQuery会将jQuery缓存起来,放到jQuery.cache对象中。在调用jQuery的remove方法的时候,会清理掉jQuery的缓存。我们的问题就出在这里,在Raphael中,自己有remove方法来清楚Raphael创建的raphael对象和svg/vml元素。而在chart中,我们会使用jQuery在raphael创建的svg/vml元素上。这样在调用raphael的remove方法的时候,就不能移除jQuery缓存。由此造成了对象一直保留内存中。
在Raphael中,自己的animate和remove方法也存在说明,就是在animate的时候,会创建animate需要的一些对象缓存到raphael对象中,在调用stop方法的时候会清理掉这些元素。而当remove的时候,仅仅做了remove的事情,并没有移除掉这些对象。而在文档中也没有提到需要注意的问题。我们在使用的时候,就没有注意到正在做动画的元素在remove的时候直接调用remove方法,没有在之前调stop。这样也造成了对象不能销毁。
上述两个问题是造成内存泄漏的主要原因。在试用jQuery的时候,如果要删除dom对象的话,最好采用jQuery的remove方法,否则可能会出现诸如我们那样的问题。在jQuery的remove方法中还会清楚掉时间绑定等信息。