• 1.首家专业真正意义的悬赏问答赚钱网站!
  • 2.我们相信:重金之下必有勇者,钱能促进回答!
  • 3.购买答案别害怕,网站有担保,不满意可退款,拒绝恶意操作!
  • 4.回答售出就有收益,永久不限次数为您持续产生收益!
  • 5.提问也可以赚钱了,提问所属答案被购买确认,也可产生收益!
  • 6.收益计量都是不限次数、时间、地点,真正意义上的摇钱树!
  • 7.购买者是提问者本人,回答者享有百分百收益!
  • 8.自问自答模式已开启!经验/文章博客/聊天记录变问答赚钱!
    未登录
    当前位置: 首页 在线答疑 计算机 问题详情

    请详谈一下JavaScript的内存回收机制

    • 提问人:138*****763
    • 问者自答:否
    • 浏览次数:737
    • 所属领域: 网站前端 JavaScript
    期望100.00金币,托管 0.00金币
    • 发布时间 2017-12-18 12:19
    • 期望完成时间 2017-12-25
    • 首次回答(共1个回答) 2017-12-18 15:01
    • 首次成交(共0笔成交)
    • 永无止息 预计10元成交金额

    手机号码为138*****763的用户, 现在她通过我站悬赏问答网发布了一个紧急帮助信息,标题是:【请详谈一下JavaScript的内存回收机制】,具体需求内容是【垃圾回收器会每隔一段时间找出那些不再使用的内存,然后为其释放内存。一般使用标记清...】,但是由于本站人力物力有限,由于其问题太过于专业性太强,也或者是我们根本无暇顾及该用户的具体需求,导致本站根本无法为该用户提供最有效的服务。现在她(他)通过本站悬赏问答网平台发布了这一需求,希望有能人之士能够帮他解决这一个问题,并愿意付出10元作为报酬,不甚感激。

    如果您觉得这个提问很好,可以点击左方的按钮进行推广,支持微信,短信和邮件推广。

    注:10元只是象征性的价格标示,不代表实际成交价格,实际成交价格以能回答之人的定价为准。如果答案确实好,并且列出了一部分可信的免费内容(足以让购买回答答案者用户放心购买),则您可以放心购买。如果通过本站购买产生了交易纠纷,本站愿意承担一切线上交易的成交财务风险(限定在悬赏以后发生的购买金额范围以内,不承担线下交易的人身风险以及财务风险等任何风险)。

    如果你无法确定或者不知道回答的内容是不是你想要的,可以在线咨询回答者以确定具体情况,根据具体情况请回答者做必要的修改或者补充。 如果确实已经发生了交易纠纷,您可以联系本站 仲裁处理

    提问详情
    垃圾回收器会每隔一段时间找出那些不再使用的内存,然后为其释放内存。
    一般使用标记清除方法  当变量进入环境标记为进入环境,离开环境标记为离开环境
    还有引用计数方法


    显示全部
    我来回答 注:回答售价不受提问人的期望和托管资金影响,您可以按照自己的意愿定价。 订阅 收藏
    加入备选
    155*****529 155*****529 2017-12-18 15:01:32

    一、垃圾回收机制—GC

    Javascript具有自动垃圾回收机制(GC:Garbage Collecation),也就是说,执行环境会负责管理代码执行过程中使用的内存。

    原理:垃圾收集器会定期(周期性)找出那些不在继续使用的变量,然后释放其内存。

    JavaScript垃圾回收的机制很简单:找出不再使用的变量,然后释放掉其占用的内存,但是这个过程不是实时的,因为其开销比较大,所以垃圾回收器会按照固定的时间间隔周期性的执行。

    不再使用的变量也就是生命周期结束的变量,当然只可能是局部变量,全局变量的生命周期直至浏览器卸载页面才会结束。局部变量只在函数的执行过程中存在,而在这个过程中会为局部变量在栈或堆上分配相应的空间,以存储它们的值,然后在函数中使用这些变量,直至函数结束,而闭包中由于内部函数的原因,外部函数并不能算是结束。

    还是上代码说明吧:

    functionfn1() {
     varobj = {name: 'hanzichi', age: 10};//被标记 ,进入环境
    }
    functionfn2() {
     varobj = {name:'hanzichi', age: 10};//被标记 ,进入环境
     returnobj;
    }
    vara = fn1();//执行完毕 之后 a、b又被标离开环境,被回收。
    varb = fn2();//返回的对象被全局变量b所指向,所以该块内存并不会被释放。


            我们来看代码是如何执行的。首先定义了两个function,分别叫做fn1和fn2,当fn1被调用时,进入fn1的环境,会开辟一块内存存放对象{name: 'hanzichi', age: 10},而当调用结束后,出了fn1的环境,那么该块内存会被js引擎中的垃圾回收器自动释放;在fn2被调用的过程中,返回的对象被全局变量b所指向,所以该块内存并不会被释放。

            这里问题就出现了:到底哪个变量是没有用的?所以垃圾收集器必须跟踪到底哪个变量没用,对于不再有用的变量打上标记,以备将来收回其内存。用于标记的无用变量的策略可能因实现而有所区别,通常情况下有两种实现方式:标记清除和引用计数。引用计数不太常用,标记清除较为常用。

    二、标记清除

    js中最常用的垃圾回收方式就是标记清除。当变量进入环境时,例如,在函数中声明一个变量,就将这个变量标记为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就可能会用到它们。而当变量离开环境时,则将其标记为“离开环境”。

    functiontest(){
     vara = 10 ; //被标记 ,进入环境
     varb = 20 ; //被标记 ,进入环境
    }
    test(); //执行完毕 之后 a、b又被标离开环境,被回收。


            垃圾回收器在运行的时候会给存储在内存中的所有变量都加上标记(当然,可以使用任何标记方式)。然后,它会去掉环境中的变量以及被环境中的变量引用的变量的标记(闭包)。而在此之后再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后,垃圾回收器完成内存清除工作,销毁那些带标记的值并回收它们所占用的内存空间。

      到目前为止,IE、Firefox、Opera、Chrome、Safari的js实现使用的都是标记清除的垃圾回收策略或类似的策略,只不过垃圾收集的时间间隔互不相同。

    展开阅读全文
    0 ID:118 0人购买 0人评价 好评率:0%
    返回顶部 联系客服 消息中心0