首页 > 其他分享 >js 垃圾回收机制

js 垃圾回收机制

时间:2024-01-11 12:11:07浏览次数:28  
标签:垃圾 变量 对象 回收 js 内存 引用

一 、概述

垃圾回收机制是为了防止内存的泄漏(已经不需要的某一块内存还一直存在着),垃圾回收机制就是不停歇的寻找这些不再使用的变量,并且释放掉他所指向的内存。

2、变量的生命周期

变量被声明、赋值(修改)、读取、不需要时释放,是变量的生命周期。js中的变量分为局部变量和全局变量。局部变量在他当前的函数中产生作用,当该函数结束之后,该变量内存会被释放。全局变量一直存在,直到他被销毁或者浏览器关闭。

为了使开发变得简单,JavaScript 是在创建变量(对象,字符串等)时自动进行了分配内存

var n = 123; // 给数值变量分配内存
var s = "jirengu"; // 给字符串分配内存

调用函数也是内存分配

var d = new Date(); // 分配一个 Date 对象

 

3、js的垃圾回收机制分为两种:标记清除和引用计数。标记清除是指当变量进入执行环境(变量声明)的时候,垃圾回收器将该变量进行了标记,当该变量离开环境的时候,将其再度标记,随之删除。引用计数的机制是跟踪某一个值的引用计数,当生命一个变量并且将一个引用类型赋值给变量的时候,引用次数加1,当这个变量指向其他一个引用次数时减一,当他为0时,触发回收机制进行回收。

 

导致内存泄漏的场景

1、当对象仍然存在着引用,即使此对象不再需要了,垃圾回收机制也不会对其进行回收,比如未正确解除事件的监听器和定时器,导致被监听的对象一直被引用,无法被回收。

eg: 使用了addEventListener,不需要时没有使用removeEventListener;使用了setInterval或者setTimeout,不需要时没有使用clearInterval 或 clearTimeOut

2、循环引用,当两个或多个对象相互引用的时候,并且这些对象没有其他的引用关系的时候,即使这些对象不再被使用,垃圾回收机制也无法回收他们。这种情况下,对象之间形成了一个封闭的循环,导致内存泄漏。

let obj1 = {}
let obj2 = {}
obj1.child = obj2
obj2.child = obj1

解决方法为:合理设计对象之间的引用关系,避免对象型变量循环引用,使用弱引用或者断开循环引用的方法来解决。

3、未释放的资源

例如打开的句柄、网络连接、或数据库连接等资源,使用完毕后没有释放,会导致内存泄漏。

网络请求时超时时间过长,请求一直等待,可能导致内存泄漏。解决思路是使用完成操作后,尽量手动断开或设置超时,比如加上timeout属性。

 

标签:垃圾,变量,对象,回收,js,内存,引用
From: https://www.cnblogs.com/c-and-unity/p/17958279

相关文章

  • nextjs14连接MySQL
     第一步npminstallmysql2第二步新建一个db.js db.jsimportmysqlfrom"mysql2/promise";exportasyncfunctionquery({query,values=[]}){constdbconnection=awaitmysql.createPool({host:process.env.MYSQL_HOST,post:process.env.MY......
  • js Number类型
    Number是对应数值的引用类型。要创建一个Number对象,就使用Number构造函数并传入一个数值,如下例所示:letnumberObject=newNumber(10);与Boolean类型一样,Number类型重写了valueOf()、toLocaleString()和toString()方法。valueOf()方法返回Number对象表示的原始数值......
  • js Number类型
    与Boolean对象类似,Number对象也为数值提供了重要能力。但是,考虑到两者存在同样的潜在问题,因此并不建议直接实例化Number对象。在处理原始数值和引用数值时,typeof和instacnceof操作符会返回不同的结果,如下所示:letnumberObject=newNumber(10);letnumberValue=1......
  • js String类型
    String是对应字符串的引用类型。要创建一个String对象,使用String构造函数并传入一个数值,如下例所示:letstringObject=newString("helloworld");String对象的方法可以在所有字符串原始值上调用。3个继承的方法valueOf()、toLocaleString()和toString()都返回对象的......
  • js 字符串处理函数
    length、charAt()、charCodeAt()和fromCharCode()返回的结果都跟预期是一样的。这是因为在这个范围内,每个字符都是用16位表示的,而这几个方法也都基于16位码元完成操作。只要字符编码大小与码元大小一一对应,这些方法就能如期工作。这个对应关系在扩展到Unicode增补字符平面......
  • ImageClipboard js粘贴剪切板图片,已测试,可用,可获得base64
    ImageClipboardjs粘贴剪切板图片,已测试,可用,可获得base64具体用到自己项目的时候,拿源码改成自己的库,从写一遍3个小问题onpaste执行了两遍,一次是图片加载完成,一次是加载图片之前。按说应该搞两个事件来分别调用pasteCatcher应该是作为一个保底实现,我也没看明白是怎么获取剪......
  • mysql修改json字段sql备份
    updatedec_maina,dec_main_copy20240110bseta.ie_Date=b.ie_Date,a.declaration_data=b.declaration_data,a.custom_state=b.custom_state,a.content=JSON_SET(a.cont......
  • 推荐一个页面引导库 driver.js
    页面引导功能是web开发中常见的一个功能。通过页面引导功能,你可以让用户第一时间熟悉你的页面功能。今天给大家推荐一个页面引导库driver.js。简介driver.js是一款用原生js实现的页面引导库,上手非常简单,体积在gzip压缩下仅仅5kb。我们来看下如何使用driver.jsimport......
  • jsp有哪些内置对象
    Laravel是一个流行的PHP框架,它具有出色的可测试性,可以帮助开发人员在更短的时间内编写可靠的代码。但是,即使使用了这个框架,也可能会出现测试覆盖率较低的情况。测试覆盖率是指代码中已由测试案例覆盖的部分比例。测试覆盖率越高,代码质量越高。在本文中,我们将分享几种技巧,帮助您提......
  • js中反斜杠替换问题
    在windows机器上,vscode复制完相对路径,路径为反斜杠想在控制台用js将反斜杠替换为正斜杠,结果失败js的字符串是不能直接写单个反斜杠的letstr='src\aaa\bbb\ccc'实际上会变成'srcaaa\bbbccc'只有\b被保留,应该是当成正则原字符了,待验证而要真正还原反斜杠,需要转义letstr......