JS垃圾回收机制、内存泄露

本文介绍了JavaScript的垃圾回收机制,包括标记清除和引用计数策略,以及V8引擎的分代式回收机制,详细讲解了新生代和老生代的垃圾回收策略。此外,还探讨了内存泄露的常见场景,如意外的全局变量、计时器或回调函数未清除、闭包以及被遗忘的ES6 Set和Map成员,并提供了避免内存泄露的方法。
摘要由CSDN通过智能技术生成

为什么需要垃圾回收

      由于字符串、对象和数组没有固定大小,只有当他们的大小已知时,才能对他们进行动态的存储分配。JavaScript程序每次创建字符串、数组或对象时,解释器都必须分配内存来存储那个实体。只要像这样动态地分配了内存,最终都要释放这些内存以便他们能够被再用,否则,JavaScript的解释器将会消耗完系统中所有可用的内存,造成系统崩溃

垃圾回收简述

      JS 是使用垃圾回收的语言,简单来说就是执行环境负责在代码执行时管理内存。基本思路很简单:确定哪个变量不会再使用,释放它占用的内存。这个过程是周期性的,每隔一段时间就会自动运行。

      垃圾回收程序必须跟踪记录哪个变量还会使用、以及哪个变量不会再使用,以便回收内存。如果标记未使用的变量也许有不同的实现方式。不过在浏览器的发展史上、用过两种主要的标记策略:标记清理和引用计数

标记清除

      标记清楚事js垃圾回收最常用的策略。标记清除分为标记清除两个阶段完成:

  1. 遍历所有对象找标记活动对象
  2. 遍历所有对象清除没有标记对象

优点)

  • 解决对象循环引用不能回收的问题(相对于引用计数)
    缺点)
  • 空间碎片化(由于回收的空间地址不连续),不能使空间最大化使用,不会立即清除垃圾。
    标记整理(Mark-Compact)算法 就可以有效地解决以上问题,标记结束后,标记整理算法会将活着的对象(即不需要清理的对象)向内存的一端移动,最后清理掉边界的内存。

引用计数

      引用计数是对每个值都记录它被引用的次数。声明变量并赋予一个引用值时,这个值的引用数是 1。类似地,如果保存对该值引用的变量被其他值给覆盖了,那么引用值减 1。当这个值的引用数为 0 时,就说明没有办法再访问到这个值了,因此可以安全地收回其内存了。

function problem() {
   
  let objectA = new Object();
  let objectB = new Object();<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值