欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

浅谈JavaScript的自动垃圾收集机制

程序员文章站 2022-06-29 16:27:11
执行环境会负责管理代码执行过程中使用的内存,编写javascript程序时,所需内存的分配以及无用内存的回收完全实现自动管理。 原理: 找出那些不再继续使用的变量,然后...

执行环境会负责管理代码执行过程中使用的内存,编写javascript程序时,所需内存的分配以及无用内存的回收完全实现自动管理。

原理:

找出那些不再继续使用的变量,然后释放其占用的内存。为此,垃圾收集器会按照固定的时间间隔(或代码执行中预定的收集时间)周期性地执行这一操作。

垃圾收集的方式:

1.标记清除(mark-and-sweep)

  最常用的垃圾收集方式。当变量进入环境时,就将变量标记为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就可能会用到它们。当变量离开环境时,则将其标记为“离开环境”。

  立即收集器在运行时会给存储在内存中的所有变量都加上标记,然后它会去掉环境中的变量以及被环境中的变量引用的变量的标记。剩下的在被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量。最后,垃圾收集器完成内存清除,销毁那些带有标记的值并收回它们所占用的内存空间。

2.引用计数(reference counting)

  跟踪记录每个值被引用的次数,当这个值的引用次数为0时,说明没有办法再访问这个值了,因而就可以将其占用的内存空间回收回来。当垃圾收集器下次再运行时,会释放那些引用次数为零的值所占用的内存。

(1)应用机制存在一个问题:循环引用。

  循环引用是指对象a中包含一个指向对象b的指针,而对象b中也包含一个指向对象a的引用。(这样它们的引用可能永远不为0,如果函数被重复多次调用,就会导致大量的内存得不到回收。)

(2)ie中的bom和dom中的对象使用c++以com(component object model,组件对象模型)对象的形式实现,而com对象的垃圾收集机制采用的是引用计数策略。

以下是com对象导致的循环引用的问题:

eg:

var element=document.getelementbyid("some_element");
 var myobject=new object();
 myobject.element=element;
 element.someobject=myobject;

上面的例子在一个dom元素(element)和一个原生javascript对象(myobject)之间创建了循环引用。由于存在这个循环引用,即使将例子中的dom从页面移除,它也永远不会被回收。

可以使用以下代码手工断开原生javascript和dom元素之间的链接:

myobject.element=null;
element.someobject=null;

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!