垃圾回收

概念:找出那些不再继续使用的变量,然后释放其占用的内存。他会按照固定的时间间隔,或代码执行中预定的收集时间,周期性的执行这一操作。

标记清除

  • 最常用的
    当变量进入环境(例如在函数中声明一个变量)时,就将这个变量标记为进入环境。从逻辑上讲,永远不能释放进入环境的变量所占用的内存,可以使用任何方式来标记变量
    垃圾收集器在运行时给存储在内存中的所有变量都加上标记。然后去掉环境中的变量以及被环境中变量引用的变量的标记。在此之后,再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后垃圾收集器完成内存收集工作。销毁那些带标记的值,并回收他们所占用的内存。

引用计数

跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型值赋给该变量时,这个值的引用次数就是1.如果同一个值又被赋给另一个变量,则该值的引用次数加1.相反,如果包含对这个值引用的变量又取得了另外一个值,则这个值引用次数减1.当这个值得引用次数变为0时,说明没办法再访问这个值了,就将其占用的内存空间回收回来。当垃圾收集器再次运行时,释放那些引用次数为零的值所占用的内存。

限制:循环引用 => 指对象A中包含一个指向对象B的指针,而对象B中也包含了一个指向对象A的引用。

function problem () {
    var objA = new Object();
    var objB = new Object();
    objA.otherObj = objB;
    objB.anotherObj = objA;
}

上面例子中,两个对象的引用次数都是2,。若是标记清除,由于函数执行后,两个对象都离开了作用域,因此这样合理。但在计数策略实现中,他们的引用次数永远不会是0.加入这个函数被多次调用,会导致大量内存得不到回收。

解决:在不适用他们时,手动断开引用。
= null;赋值为null.

在IE中

window.CollectGarbage();

会立即执行立即回收机制。

opera中,

window.opera.collect();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供...
    简欲明心阅读 89,828评论 17 311
  • JVM内存区域 JVM将其管理的内存分为若干数据区域,这些数据区域分布情况如下图所示: 程序计数器:一块较小内存区...
    luoxn28阅读 711评论 0 0
  • 来自: Android梦想特工队作者: Aaron主页: http://www.wxtlife.com/原...
    技术特工队阅读 4,404评论 0 28
  • 一、垃圾回收机制的意义Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃...
    任任任任师艳阅读 658评论 0 0
  • 昨天我还在想,你不在,我的生活开始正常。 下班路十公里,地处偏僻,我穿着七公分的高跟,不时抬头看着远处灯光荧荧闪闪...
    谁等我三年来娶阅读 153评论 0 1