手机号码为138*****763的用户, 现在她通过我站悬赏问答网发布了一个紧急帮助信息,标题是:【请详谈一下JavaScript的内存回收机制】,具体需求内容是【垃圾回收器会每隔一段时间找出那些不再使用的内存,然后为其释放内存。一般使用标记清...】,但是由于本站人力物力有限,由于其问题太过于专业性太强,也或者是我们根本无暇顾及该用户的具体需求,导致本站根本无法为该用户提供最有效的服务。现在她(他)通过本站悬赏问答网平台发布了这一需求,希望有能人之士能够帮他解决这一个问题,并愿意付出10元作为报酬,不甚感激。
如果您觉得这个提问很好,可以点击左方的按钮进行推广,支持微信,短信和邮件推广。
注:10元只是象征性的价格标示,不代表实际成交价格,实际成交价格以能回答之人的定价为准。如果答案确实好,并且列出了一部分可信的免费内容(足以让购买回答答案者用户放心购买),则您可以放心购买。如果通过本站购买产生了交易纠纷,本站愿意承担一切线上交易的成交财务风险(限定在悬赏以后发生的购买金额范围以内,不承担线下交易的人身风险以及财务风险等任何风险)。
如果你无法确定或者不知道回答的内容是不是你想要的,可以在线咨询回答者以确定具体情况,根据具体情况请回答者做必要的修改或者补充。 如果确实已经发生了交易纠纷,您可以联系本站 仲裁处理。
一、垃圾回收机制—GC
Javascript具有自动垃圾回收机制(GC:Garbage Collecation),也就是说,执行环境会负责管理代码执行过程中使用的内存。
原理:垃圾收集器会定期(周期性)找出那些不在继续使用的变量,然后释放其内存。
JavaScript垃圾回收的机制很简单:找出不再使用的变量,然后释放掉其占用的内存,但是这个过程不是实时的,因为其开销比较大,所以垃圾回收器会按照固定的时间间隔周期性的执行。
不再使用的变量也就是生命周期结束的变量,当然只可能是局部变量,全局变量的生命周期直至浏览器卸载页面才会结束。局部变量只在函数的执行过程中存在,而在这个过程中会为局部变量在栈或堆上分配相应的空间,以存储它们的值,然后在函数中使用这些变量,直至函数结束,而闭包中由于内部函数的原因,外部函数并不能算是结束。
还是上代码说明吧:
我们来看代码是如何执行的。首先定义了两个function,分别叫做fn1和fn2,当fn1被调用时,进入fn1的环境,会开辟一块内存存放对象{name: 'hanzichi', age: 10},而当调用结束后,出了fn1的环境,那么该块内存会被js引擎中的垃圾回收器自动释放;在fn2被调用的过程中,返回的对象被全局变量b所指向,所以该块内存并不会被释放。
这里问题就出现了:到底哪个变量是没有用的?所以垃圾收集器必须跟踪到底哪个变量没用,对于不再有用的变量打上标记,以备将来收回其内存。用于标记的无用变量的策略可能因实现而有所区别,通常情况下有两种实现方式:标记清除和引用计数。引用计数不太常用,标记清除较为常用。
二、标记清除
js中最常用的垃圾回收方式就是标记清除。当变量进入环境时,例如,在函数中声明一个变量,就将这个变量标记为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就可能会用到它们。而当变量离开环境时,则将其标记为“离开环境”。
垃圾回收器在运行的时候会给存储在内存中的所有变量都加上标记(当然,可以使用任何标记方式)。然后,它会去掉环境中的变量以及被环境中的变量引用的变量的标记(闭包)。而在此之后再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后,垃圾回收器完成内存清除工作,销毁那些带标记的值并回收它们所占用的内存空间。
到目前为止,IE、Firefox、Opera、Chrome、Safari的js实现使用的都是标记清除的垃圾回收策略或类似的策略,只不过垃圾收集的时间间隔互不相同。