javascript 垃圾收集机制
❝❞
- 什么是垃圾收集?
- 垃圾收集的方式有哪些(俗称捡垃圾)?
- 什么是内存泄漏?
1、什么是垃圾收集?
❝随着业务需求的增加,代码运行时占用的内存越来越大,但是内存是有限的,对于代码执行完后的变量、对象我们是不是要自己手动去清理删除呢?
其实并不需要,「Javascript 具有自动垃圾回收机制,会定期对那些我们不再使用的变量、对象所占用的内存进行释放」。
收集这些不再使用的变量、对象,给这些变量和对象进行标记,后期回收其占用的内存的过程就是垃圾收集。
简而言之:其实并不需要,「Javascript 具有自动垃圾回收机制,会定期对那些我们不再使用的变量、对象所占用的内存进行释放」。垃圾收集器会按照固定的时间间隔周期性的执行。
Javascript 「中存在两种变量」
❞
- 「全局变量」:
- 声明周期会一直持续,直到页面卸载
- 「局部变量」:
- 局部变量声明在函数中,它的声明周期从执行函数开始,直到函数执行结束。
- 在这个过程中,局部变量会在堆或栈上被分配相应的空间以存储它们的值,函数执行结束,这些局部变量也不再被使用,它们所占用的空间也就被释放
- 「有一种情况的局部变量不会随着函数的结束而被回收」,那就是「局部变量被函数外部的变量所使用」,其中一种情况就是「闭包」,因为在函数执行结束后,「函数外部的变量依然指向函数内的局部变量」,此时的「局部变量依然在被使用」,所以也就不能够被回收
2、捡垃圾的常规方式
❝❞
- 「标记清除」
- 当变量进入执行环境时标记为“进入环境”,当变量离开执行环境时则标记为“离开环境”,被标记为“进入环境”的变量是不能被回收的,因为它们正在被使用,而标记为“离开环境”的变量则可以被回收
- 「引用计数」
- 跟踪记录每个值被引用的次数,当引用次数为0时,说明没有访问这个值了,这时会进行将其占用的内存回收。
- 引用计数的方式,有一个相对明显的缺点——循环引用
- 容易内存泄露
- 其它回收算法参考
3、什么是内存泄漏?
❝本质上讲, 内存泄露就是「不再被需要的内存」, 由于某种原因**, 无法被释放**.
为什么要管理内存?
- 防止网页耗尽全部系统内存导致系统崩溃
- 而内存限制。不仅会影响给变量分配内存,还会影响调用栈以及在一个线程中能够同时执行的语句数量。
确保占用最少的内存,让页面获得更好的性能。「优化内存占用」是最佳的方式。
一般通过「将不再使用的数据的值设置为null 来释放其引用」。这个做法就是「解除引用」。适用用大多数的「全局变量和全局对象的属性」。「局部变量」会在它们「离开执行环境」时「自动被解除引用」。
「常见内存泄漏案例:」
❞
- 「全局变量照成内存泄露」
- 「未销毁的定时器和回调函数照成内存泄露」
- 「闭包照成内存泄露」
- 「DOM 引用照成内存泄露」
本文使用 mdnice 排版