JS的垃圾回收机制和内存分配

1 JS的垃圾回收机制

JS解释器和C#,java的运行环境一样有垃圾回收机制,程序员不需要手动跟踪释放内存。

       垃圾回收机制:就是释放那些不再使用的变量。什么是不再使用?就是生命周期结束的变量,可能是全局的和局部的。

       例如:

<span style="font-size:14px;">function A(){
 var i = {name:'qiqi'};
}

function B(){
   var i = {name:'qiqi'};
   return i;
}
var n = A();
var m =B();
</span>

       当 A调用时,进入A的环境,那么内存中会开辟存放 {name:’qiqi’} 对象的内存,当调用结束后,出A 的环境,那么该内存会被JS引擎中的垃圾回收器自动释放其内存。

B中,对象被返回,并且被变量 i所指向,所以虽然说在调用完B 后出了其环境,但是由于i仍然持续着对对象的链接关系,所以该对象不会被释放。

       垃圾回收的方式:

       ① 标记清除:

      垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记,然后去掉环境中的变量以及被环境中变量所引用的变量(闭包),在这些完成之后仍存在标记的就是要删除的变量了,因为环境中的变量已经无法访问到这些变量了,然后垃圾回收器相会这些带有标记的变量机器所占空间。至于怎么标记有很多种方式,比如特殊位的反转、维护一个列表等,这些并不重要。

      ②引用计数:

      在低版本IE中经常会出现内存泄露,很多时候就是因为其采用引用计数方式进行垃圾回收。引用计数的策略是跟踪记录每个值被使用的次数,当声明了一个变量并将一个引用类型赋值给该变量的时候这个值的引用次数就加1,如果该变量的值变成了另外一个,则这个值得引用次数减1,当这个值的引用次数变为0的时候,说明没有变量在使用,这个值没法被访问了,因此可以将其占用的空间回收,这样垃圾回收器会在运行的时候清理掉引用次数为0的值占用的空间。为什么很少有浏览器采用,还会带来内存泄露问题呢?主要是因为这种方式没办法解决循环引用问题。


2 JS的内存分配:

      

javascript中的变量分为两种,原始值和引用值。原始值指的是原始数据类型的值,比如undefined,null,number,string,boolean类型所表示的值。引用值指的是复合数据类型的值,即Object,Function,Array等。

  原始值和引用值存储在内存中的位置分别为栈和堆。原始值是存储在栈中的简单数据段,他们的值直接存储在变量访问的位置。引用值是存储在堆中的对象。

存储在栈中的值是一个指针,指向存储在堆中的实际对象。     

<span style="font-size:14px;">function Person(id,name,age){ 
this.id = id; 
this.name = name; 
this.age = age; 
} 
var num = 10; 
var bol = true; 
var str = "abc"; 
var obj = new Object(); 
var arr = ['a','b','c']; 
var person = new Person(100,"jxl",22);</span>

   由上图可知我们无法直接操作存储在堆中的数据,但是我们可以通过栈中的引用来操作对象。

         栈的优势就是存取速度比堆要快,存放在一级缓存中,仅次于直接位于CPU中的寄存器,但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。

         堆的优势是可以动态地分配内存大小,存在二级缓存中,生存期也不必事先告诉编译器,垃圾收集器会自动地收走这些不再使用的数据,比如对象和数组是可以无限拓展的,正好放在可以动态分配大小的堆中。但是缺点是由于在运行时动态分配内存,所以存取速度较慢。

3 JS解释器:

        就是执行你的javascript代码的东东,就像你的java代码由JVM执行,javascript是由javascript解释器执行,浏览器中一般都会包含这个。
 每个浏览器的并不一样,一般都包含在各浏览器的内核中
 浏览器内核一般包含两个引擎:页面排版引擎 和 JS引擎


 IE的 使用的自己的Trident 内核
 FireFox 是Gecko内核
Opera 是Presto内核
Safari 使用的Webkit 内核
Chrome 是Google自己的 javascript V8引擎 而其页面排版采用的Webkit 内核


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值