js关于垃圾回收的总结

226 阅读2分钟

浏览器怎么进行垃圾回收?

  1. 从三个点来回答什么是垃圾、如何捡垃圾、什么时候捡垃圾

什么是垃圾

一般对象不被引用,不再需要就是垃圾,特殊情况就是一些对象互相引用,但是根断了引用,也是垃圾。全局变量随时可能用到,不是垃圾。

如何回收垃圾

从根节点(Root)出发,遍历所有的对象。

可以遍历到的对象,是可达的(reachable)。

没有被遍历到的对象,不可达的(unreachable)

回收「不可达」的值所占据的内存。

做内存整理。

回收的优化方法有分代收集,增量收集,闲时收集

什么时候回收

前端有其特殊性,垃圾回收的时候会造成页面卡顿。

在cpu空闲时候回进行垃圾回收

浏览器中不同类型变量的内存都是何时释放

Javascritp 中类型:值类型,引用类型。

引用类型:在没有引用之后。通过v8自动回收

值类型:

如果处于闭包的情况下,要等闭包没有引用才会被 V8 回收。 非闭包的情况下,等待 V8 的新生代切换的时候回收。

哪些情况会导致内存泄露?如何避免?

内存泄露是指你「用不到」(访问不到)的变量,依然占居着内存空间,内侧无法释放,也不能被再次利用起来。

常见的内存泄露:

意外的全局变量,比如在局部变量中没有用 var定义变量,使变量变成了全 局的变量。 定时器设置了,后面不需要时没有清除定时器 脱离 DOM 的引用(详细可以去看相关博客)

总结

浏览器怎么进行垃圾回收? 答题思路:什么是垃圾、怎么收垃圾、什么时候收垃圾。

浏览器中不同类型变量的内存都是何时释放? 答题思路:分为值类型、引用类型。

哪些情况会导致内存泄露?如何避免? 答题思路:内存泄露是指你「用不到」(访问不到)的变量,依然占居着内存空间,不能被再次利用起来。

weakMap weakSet 和 Map Set 有什么区别? 答题思路:WeakMap、WeakSet 弱引用,解决了内存泄露问题。