长久不用的一些在内存中的变量会被浏览器回收掉,具体的咋回收的呢
GC——垃圾回收
找出不再使用的变量,然后释放掉占用的内存;因此垃圾回收器会定期的执行。
var a = "造火箭";
var b = "拧螺丝";
var a = b;
造火箭
这个字符串失去了引用(之前是被a引用),系统检测到之后,就会释放该字符串的储存空间,以回收利用
如何知道,到底哪些内存可回收?
一个循环引用的🌰:
function cycle() {
var o1 = {};
var o2 = {};
o1.a = o2;
o2.a = o1;
return "cycle reference!"
}
cycle();
1.标记清除
标记阶段:从根部开始,逐层往里遍历,遍历到堆中的对象时,说明有被使用,立马打上标记,继续往下遍历直到最深的一层节点
清除阶段:遍历整个堆,回收没有打上标记的对象。
- 可以解决循环引用问题,因为两个对象从全局对象出发无法获取。因此,他们无法被标记,他们将会被垃圾回收器回收
- 是否加标记,只需要分两种情况做标志位,节省空间
所以现在对于主流浏览器来说,只需要切断需要回收的对象与根部的联系。
2.引用计数 (现代浏览器不常用了)
优点和原理:
- 即刻回收,当被引用次数为0时,对象马上会把自己作为空闲空间连到空闲链表上,也就是,在变成垃圾的时候就立刻被回收。
- 因此就不用去遍历堆里面的所有活动对象和非活动对象
劣势:
- 万一被引用次数很大,需要很大内存来储存记录的次数;
- 循环引用无法解决,因为他们的被引用次数,均不会为零
网友评论