内存管理 内存泄漏

垃圾回收机制是周期性的,按照特定的周期循环,或者按照预先定义的时间执行
 
最流行的回收机制是mark-and-sweep
当一个变量进入当前上下文,那么会被标示为在上下文中,内存不会被释放,当他离开会被标示为不在上下文,当垃圾回收机制运行的时候,它会首先记录内存里的所有变量,然后将那些在上下文中和被在上下文中变量引用的变量去掉,然后剩下的变量会被销毁,它们占用的内存也会被回收
 
As of 2008, Internet Explorer, Firefox, Opera, Chrome, and Safari all use mark-and-sweep garbage collection (or variations thereof) in their JavaScript implementations, though the timing of garbage collection differs.
 
另一种回收机制为reference counting,这个方法的原理是每一个对象记着有对自己的引用总数,当垃圾回收运行的时候,会把引用数为0的值销毁释放内存。这个机制有个严重的问题,当对象相互引用时,会出现circular references,因此现在的浏览器都不在使用这种算法。但是在ie8及之前的浏览器里并不是所有的对象都是原生对象,Dom 和BOM 里的对象被称之为COM (Component Object Model) 对象,使用C++实现。而Com里面是用reference counting作为垃圾回收机制的,因此还是会存在问题。例如:
 
var element = document.getElementById(“some_element”); var myObject = new Object();
myObject.element = element;
element.someObject = myObject;
解决方法
myObject.element = null; element.someObject = null;
 
在ie浏览器通过window.CollectGarbage()出发回收,opera通过window.opera.collect()

posted on 2016-01-27 17:45  迷茫小飞侠  阅读(147)  评论(0编辑  收藏  举报

导航