说真心的,自动垃圾回收机制真的是解放人类啊

一、生命周期

1. 局部变量的生命周期

变量在函数执行过程中才会存在,这个过程中,会进行内容分配给变量,存储变量的值。

函数执行结束后,局部变量进行内存释放,回收内存。

二、垃圾回收方式

最常用的 标记清除 方式:

下面是我自己的简单的理解:

  1. 创建变量,则进行内存的分配,同时标记变量进入环境(进入环境包括下面的词语来自《javascript高级程序设计》)

    • 基本上进入环境的变量是不会被回收的
  2. 变量使用完成(比如函数内的局部变量在函数执行完成后,即完成使命),标记为离开环境
  3. 定期进行检测,将离开环境的变量进行内存的回收和释放

引用计数方式的问题

所谓的引用计数无非就是某个值的使用次数初始值1(声明),使用这个值的时候 +1 ,不再使用这个值,则 -1

var name = "postbird";
function newName(){
    name = "ptbird";
}
name = "ppppp";

这个过程中, "postbird" 被声明,为1 而"ptbird"被重新声明,则之前的"postbird"就没了。以此类推

1. 循环引用

function wrong(){
  var oA = new Object();
  var oB = new Object();
  oB.sub = oA;
  oA.sub = Ob;
}

上面的例子,导致 oA 和 oB 的引用次数都是2,引用次数永远不会是 0

三、垃圾收集器引起的性能问题

垃圾收集器是周期性运行的,而且如果为变量分配的内存数量很可观,那么回收工作量也是相当大。

《javascript高级程序设计》中提到了臭名昭著的IE7垃圾回收问题,不过我没赶上那个时代。

建议:

即使不需要我们时刻盯着内存,但是也要有一个良好的编程习惯,当一个变量不在需求的时候,主动将其设置为null , name = null; 能够提醒垃圾收集器,下次释放内存的时候,将其干掉。

置为 null 不会立刻被销毁,仍旧需要等到下次的垃圾回收