Skip to content

闭包和内存泄漏的关系

什么是垃圾?

  1. 垃圾就是不再需要使用的变量

js的垃圾回收器是怎么回收的?

  1. 使用者无法触达的变量信息,他能确定你一定不想要,于是会回收; 什么是内存泄漏?
  2. 你已经不再需要使用的变量,但是依然能够触达,因此垃圾回收机制不会回收,这就是内存泄漏

垃圾回收器的实现方法:

  1. 引用计数
  2. 标记清除

闭包和内存泄漏的关系:

  1. 闭包很容易让人放松警惕,导致内存泄漏
  2. 闭包和其他的内存泄漏没有什么本质上的区别,都是持有了不再需要的函数引用,会导致函数关联的词法环境无法销毁,从而导致内存泄漏
  3. 闭包容易产生一个非常隐秘的泄漏点:当多个函数共享词法环境时,会导致词法环境膨胀,从而导致无法触及又无法回收的内存空间
js
//隐蔽的内存泄漏
function main(){
    const doms = (1000个dom对象)
    function f1(){}
    function f2(){doms}
    return f1
}
main()
//此时的doms完全无法触达,但是不会被回收,因为他和别的函数共享词法环境,当运行完f1以后,由于f2需要用到,所以不会回收。

调试:

浏览器的Memory里可以看内存占用和手动进行垃圾回收