浏览器怎么进行垃圾回收?
- 从三个点来回答什么是垃圾、如何捡垃圾、什么时候捡垃圾
什么是垃圾
一般对象不被引用,不再需要就是垃圾,特殊情况就是一些对象互相引用,但是根断了引用,也是垃圾。全局变量随时可能用到,不是垃圾。
如何回收垃圾
从根节点(Root)出发,遍历所有的对象。
可以遍历到的对象,是可达的(reachable)。
没有被遍历到的对象,不可达的(unreachable)
回收「不可达」的值所占据的内存。
做内存整理。
回收的优化方法有分代收集,增量收集,闲时收集
什么时候回收
前端有其特殊性,垃圾回收的时候会造成页面卡顿。
在cpu空闲时候回进行垃圾回收
浏览器中不同类型变量的内存都是何时释放
Javascritp 中类型:值类型,引用类型。
引用类型:在没有引用之后。通过v8自动回收
值类型:
如果处于闭包的情况下,要等闭包没有引用才会被 V8 回收。 非闭包的情况下,等待 V8 的新生代切换的时候回收。
哪些情况会导致内存泄露?如何避免?
内存泄露是指你「用不到」(访问不到)的变量,依然占居着内存空间,内侧无法释放,也不能被再次利用起来。
常见的内存泄露:
意外的全局变量,比如在局部变量中没有用 var定义变量,使变量变成了全 局的变量。 定时器设置了,后面不需要时没有清除定时器 脱离 DOM 的引用(详细可以去看相关博客)
总结
浏览器怎么进行垃圾回收? 答题思路:什么是垃圾、怎么收垃圾、什么时候收垃圾。
浏览器中不同类型变量的内存都是何时释放? 答题思路:分为值类型、引用类型。
哪些情况会导致内存泄露?如何避免? 答题思路:内存泄露是指你「用不到」(访问不到)的变量,依然占居着内存空间,不能被再次利用起来。
weakMap weakSet 和 Map Set 有什么区别? 答题思路:WeakMap、WeakSet 弱引用,解决了内存泄露问题。