js内存泄露与垃圾回收机制

C#、Java、JavaScript有自动垃圾回收机制,但c++和c就没有垃圾回收机制,也许是因为垃圾回收机制必须由一种平台来实现。在JS中,JS的执行环境会负责管理代码执行过程中使用的内存
 Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。

JS垃圾回收方式
Javascript采用标记-清除为主(高版本浏览器),引用计数为辅的策略(低版本IE)
1.    标记清除
工作原理:是当变量进入环境时,将这个变量标记为“进入环境”。当变量离开环境时,则将其标记为“离开环境”。标记“离开环境”的就回收内存。

工作流程:

    1.    垃圾回收器,在运行的时候会给存储在内存中的所有变量都加上标记。

    2.    去掉环境中的变量以及被环境中的变量引用的变量的标记。

    3.    再被加上标记的会被视为准备删除的变量。

    4.    垃圾回收器完成内存清除工作,销毁那些带标记的值并回收他们所占用的内存空间。

2.    引用计数
工作原理:跟踪记录每个值被引用的次数。

工作流程:

    1.    声明了一个变量并将一个引用类型的值赋值给这个变量,这个引用类型值的引用次数就是1。

    2.    同一个值又被赋值给另一个变量,这个引用类型值的引用次数加1.

    3.    当包含这个引用类型值的变量又被赋值成另一个值了,那么这个引用类型值的引用次数减1.

    4.    当引用次数变成0时,说明没办法访问这个值了。

    5.    当垃圾收集器下一次运行时,它就会释放引用次数是0的值所占的内存。

function test() {

  var a = {}; //a的引用次数为0

  var b = a; //a的引用次数加1,为1

  var c = a; //a的引用次数再加1,为2

  var b = {}; //a的引用次数减1,为1

}


 

 在这个例子中,objectA 和 objectB 通过各自的属性相互引用;也就是说,这两个对象的引用次数都是 2。

  在采用标记清除策略的实现中,由于函数执行之后,这两个对象都离开了作用域,因此这种相互引用不是个问题。但在采用引用计数策略的实现中,当函数执行完毕后,objectA 和 objectB 还将继续存在,因为它们的引用次数永远不会是 0。

  假如这个函数被重复多次调用,就会导致大量内存得不到回收。为此放弃了引用计数方式,转而采用标记清除来实现其垃圾收集机制。可是,引用计数导致的麻烦并未就此终结。

  IE 中有一部分对象并不是原生 JavaScript 对象。例如,其 BOM 和 DOM 中的对象就是使用 C++以 COM(Component Object Model,组件对象模型)对象的形式实现的,而 COM对象的垃圾 收集机制采用的就是引用计数策略。

  因此,即使 IE的 JavaScript引擎是使用标记清除策略来实现的,但 JavaScript访问的 COM对象依然是基于引用计数策略的。换句话说,只要在IE中涉及 COM对象,就会存在循环引用的问题。

function problem(){     
    var objectA = new Object();
    var objectB = new Object(); 
 
    objectA.someOtherObject = objectB;
    objectB.anotherObject = objectA; 
}

more  https://www.cnblogs.com/chuaWeb/p/5196330.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值