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

2020-07-21  本文已影响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 ;
}
上一篇下一篇

猜你喜欢

热点阅读