美文网首页
内存(垃圾回收,内存泄漏)

内存(垃圾回收,内存泄漏)

作者: 凉城十月 | 来源:发表于2020-07-21 21:58 被阅读0次

    1.EMCAScript规定,数字都是64位存储的,字符串都是16位存储的。

    2.简单类型直接存储在stack中,复杂类型(obj)将Heap地址存到stack中。

    3.对象中self的用法:

    错误用法:

    var a = {self: a}
    console.log(a.self) //undefined
    

    a是undefined,因为出现变量提升。实际代码为

    var a ;
    a={self: a}
    console.log(a.self)//undefined
    

    赋值给self的a是第一行的a,实际的值是undefined。
    正确用法:

    var  a= { };
    a.self=a;
    console.log(a.self) //a
    

    这里的a.self是对象a。

    4.面试题

    1.【引用】

    var a= {n:1};
    var b=a;
    a.x= a = {n: 2};
    alert(a.x); //undefined
    alert(b.x); //[object Object] , alert会调用toString()方法
    

    解析:


    题1解析

    代码第三行的赋值,是从右往左赋值,所以中间的a其实指向的是ADDR22,左边的a.x的a指向的是ADDR21,根据内存图显示a.x为undefined,b.x为对象ADDR22,alert调用toString()方法,所以b.x为[object Object]。

    2.【持续引用】

    var fn = function(){ };
    document.body.onclick = fn;
    fn = null;
    
    题2解析
    前两句代码如图,当fn=null时,也就是将stack中的ADDR33替换成null,同时heap中的内存不存在垃圾。
    但是,当document.body.onclick = null时,fn就是一个垃圾,应该被回收。
    如果将浏览器关闭,那么heap中的所有内存都将是垃圾,因为连document都没有了。这时垃圾就会被回收,但是IE6中存在bug。

    垃圾回收:如果一个对象没有被引用,它就是垃圾,将被回收。垃圾回收的实质是找一个树的根。
    内存泄漏:由于浏览器的bug导致一些该被标记为垃圾的东西没有被标记成垃圾,内存就会被永久占用,除非将整个浏览器关掉。

    若浏览器没有关闭,IE6存在内存泄漏bug,不会认为heap中没有被引用的的相连内存块是垃圾,解决办法:

    window.onunload = function(){
      document.body.onclick = null ;
    }
    

    相关文章

      网友评论

          本文标题:内存(垃圾回收,内存泄漏)

          本文链接:https://www.haomeiwen.com/subject/kgewcktx.html