垃圾回收

9人阅读 评论(0) 收藏 举报
分类:

    浏览器的垃圾回收机制会定期的运行,借以清理javascript运行过程中的内存垃圾。常见的垃圾回收策略有以下两种:

   1.标记清除

       垃圾回收例程先给内存中的变量打上标记,然后对于那些进入执行环境的变量清除掉他们的标记,再针对那些仍然拥有标记的变量进行回收。 

   2.引用计数

        当将一个引用类型的值赋值给某个变量的时候,该值的引用次数就加1。当包含对该值的引用的变量赋值为另外一个值,该值的引用次数就减1.当垃圾回收例程运行的时候会针对那些引用次数为0的对象进行回收,理由是这些对象不会再被访问到。


   内存泄露:

   1.IE中对于BOM和DOM的对象的实现方式是c++的COM对象的实现方式,因此也采用引用计数方式进行垃圾回收。

var input = document.getElementById("test");
var obj = {};
obj.input = input;
input.parent = obj;
    针对上面的例子,由于obj的input属性指向了Dom对象input,input的引用次数将为2(包括 input变量自身),则垃圾回收例程在回收的时候将不能回收input对象。即使离开当前执行环境也无法回收。obj这个变量虽然在离开当前执行环境会被回收,但是它所指向的引用对象将不会被回收。因为存在循环引用。
window.onload = function () {
            (function () {
                var input = document.getElementById("test");
                var obj = {};
                obj.input = input;
                input.parent = obj;
            })();
            alert(typeof input);//undefined
            alert(typeof obj);//undefined
            var input2 = document.getElementById("test");
            alert(typeof input2.parent)//object
}

基于以上情况,为了维护内存,建议在对象使用完以后将变量设置为null,解除引用,使得变量的值脱离当前执行环境,也可以使得Dom对象的引用计数变为0。

obj.input = null;
input.parent = null;

另外一种循环引用的写法:

function handler() {
    var input = document.getElementById("test");
    input.click = function () {
        alert(input.value);
    }
}

其中闭包函数的作用域链中有对于handler变量对象的引用,而input的click又指向该匿名函数,导致循环引用。input对象将无法回收,改下代码如下:

function handler() {
    var input = document.getElementById("test");
    var value = input.value;
    input.click = function () {
        alert(value);
    }
    input = null;//如果不设置input=null还是循环引用,设置为null才能保证闭包函数作用域链的变量对象对于input的引用消除
}

查看评论

简介三种垃圾回收机制:分代复制垃圾回收,标记垃圾回收,增量垃圾回收

一、分代复制垃圾回收 不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。 在Java程序运行的过程中,会产生大量的对象,其中有些对象是与业务信息相关,比...
  • Java_Grass
  • Java_Grass
  • 2017-03-17 13:52:13
  • 2276

浅谈.NET垃圾回收

最近在做Winform项目优化,项目运行十天,内存就达到3G,真是让人头疼,到现在还没有完全解决,,,下面来说说.NET垃圾回收原理与算法 每个程序都有这样或者那样的资源,如数据库连接、网络连接、...
  • xiaoyiyz
  • xiaoyiyz
  • 2015-01-22 11:26:17
  • 1067

jvm中分代垃圾回收和触发垃圾回收

如图所示,在HotSpot虚拟机中共划分有三个代:年轻代(young generation),年老代(old generation)和持久代(permanent generation)。实际上真正有意...
  • u012129558
  • u012129558
  • 2016-05-14 11:02:15
  • 539

JavaScript的垃圾回收

一.它是什么?? JavaScript垃圾回收的机制很简单:找出不再使用的变量,然后释放掉其占用的内存,但是这个过程不是时时的,因为其开销比较大,所以垃圾回收器会按照固定的时间间隔周期性的执行。...
  • qq_34986769
  • qq_34986769
  • 2016-07-21 18:01:56
  • 375

Flash AS3 垃圾回收机制详解

英文原文:http://gskinner.com/blog/archives/2006/06/as3_resource_ma.html http://active.tutsplus.com/tuto...
  • zjhhust
  • zjhhust
  • 2012-10-06 15:20:56
  • 1410

面试题:java垃圾回收的命令是什么及其执行过程

面试题:java垃圾回收的命令是什么及其执行过程首先:java内存是怎样分配的,对象是在5个地方存储数据1.寄存器 java不能操作寄存器,汇编语言可以直接操作寄存器,可以忽略器存在;2.堆栈 位于R...
  • fwk19840301
  • fwk19840301
  • 2018-02-22 18:18:03
  • 1149

垃圾回收过程

对于年轻代,刚开始创建的对象都是放置在eden区的,而将年轻代分成3个部分,主要是为了生命周期短的对象尽量留在年轻代。当eden区申请不到空间的时候,进行minorGC,把存活的对象拷贝到survio...
  • woshichuanqihan
  • woshichuanqihan
  • 2016-03-21 14:47:19
  • 1172

java什么时候进行垃圾回收,垃圾回收的执行流程

今天所学,做下笔记 java的垃圾回收分为 三个区域新生代 老年代 永久代 一个对象实例化时 先去看伊甸园有没有足够的空间 如果有 不进行垃圾回收 ,对象直接在...
  • jidong2622
  • jidong2622
  • 2017-10-01 14:23:43
  • 1568

Java垃圾回收日志解析

Java垃圾回收日志解析1.开启垃圾回收日志  在运行一个java程序时可以在命令行中加入相应的JVM垃圾回收参数,获取程序运行时详细的垃圾回收日志信息。以下是一些大概的参数: -XX:+PrintG...
  • u014297175
  • u014297175
  • 2017-07-14 10:42:12
  • 784

jvm垃圾回收是什么时候触发的? 垃圾回收算法? 都有哪些垃圾回收器

1.1。那究竟GC为我们做了什么操作呢? 1 ,哪些内存需要回收?    2 ,什么时候回收?    3 ,如何回收?     这时候有人就会疑惑了,既然GC 已经为我们解决了这个矛盾,我们还需要学习...
  • sunny243788557
  • sunny243788557
  • 2016-10-12 14:50:24
  • 6515
    个人资料
    等级:
    访问量: 0
    积分: 50
    排名: 0
    文章分类
    文章存档