当前位置:网站首页>垃圾回收机制
垃圾回收机制
2022-04-21 08:36:00 【谷歌玩家】
垃圾回收机制
垃圾回收的概念
JS代码运行时,需要分配内存空间来存储变量和值,当变量不再参与运行时,就需要系统收回被占用的内存空间。
回收机制
- JS具有自动回收机制,会定期对那些不再使用的变量、对象所占用的内存进行释放,原理就是找到不再使用的变量,然后释放掉其占用的内存。
- JS有全局变量和局部变量。 全局变量会一直保存在内存中,直到页面卸载才回收变量内存;局部变量声明在函数内部,会在函数执行结束后回收内存。
- 当使用闭包时,函数内部定义的局部变量会一直留在内存中,不会被使用。 所以尽量避免使用闭包,以免造成内存泄漏。
垃圾回收方式
- 标记清除:
- 当变量进行执行环境时,就标记这个变量
进入环境,被标记为进入幻境的变量是不能被回收的,因为他们正在被使用。当变量离开环境时,就会被标记为离开环境,被标记为离开环境的变量会被内存释放。 - 垃圾收集器在运行时会给存储在内存中的所有变量加上标记。然后,它会去掉环境中的变量和被环境中的变量引用的标记,剩下的变量将被视为需要删除的变量,垃圾收集器完成内存清除工作,销毁那些带有标记的值并回收他们所占用的内存。
- 引用计数:
- 引用计数就是跟踪记录每个值被引用的次数,当声明了一个变量并将一个引用类型赋值给该变量时,则这个值的引用次数就是1;相反,如果包含这个值引用的变量又取得另一个值,则这个值的引用次数就减1.当这个引用次数变为0,说明这个变量就没有用了,在下次垃圾回收器下次运行时会回收内存。
- 这种方法会引起循环引用问题,例如:
function fun(){
let obj1 = {
}
let obj2 = {
}
obj1.a = obj2 // obj1引用obj2
obj2.a = obj1 // obj2引用obj1
}
在上面的例子中,obj1和obj2相互引用,两个对象的引用次数都为2.当函数执行完后,两个对象离开作用域,但obj1和obj2的引用次数还是2,不会减为0,这样就不会被回收。
解决方式就是:手动释放内存。
obj1.a = null
obj2.a = null
减少垃圾回收
虽然浏览器可以进行自动垃圾回收,但当代码比较复杂时,垃圾回收的代价比较大,所以应该尽量减少垃圾回收。
- 对数组进行优化:在清空一个数组时,将其赋值为
[] - 对object进行优化:对象尽量复用,对于不再使用的对象,赋值为
null - 对函数进行优化:在循环中的
函数表达式,如果可以复用,尽量放在函数外部
哪些情况会导致内存泄漏
- 意外的全局变量:如果一个变量未声明,就会意外的创建一个全局变量,这会使这个变量一直放在内存中无法被回收
- 被遗忘的计时器或回调函数:设置了setInterval而忘记取消它,如果循环函数有对外部变量的引用的话,那么这个变量会被一直留在内存中,而无法被回收
- 闭包:不合理的使用闭包,会导致变量一直存在内存中
- 脱离DOM的引用:获取了一个DOM元素的引用,而后面这个元素被删除,由于一直保留了对这个元素的引用,所以无法被回收
版权声明
本文为[谷歌玩家]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_43539854/article/details/124292153
边栏推荐
- MySQL error of Navicat connection under Linux access denied for user 'root' @ 'xxx XXX. XXX. XXX‘ (USING PASSWORD: YES
- The resolution database could not be started
- 将pyx文件编译成pyd文件(很多坑,已解决)
- Alibaba Wen Shao came out again to reconstruct fastjson and launch fastjson 2
- JVM——》常用参数
- ThinkPHP quick start (III)
- 最近发现百度云分享都要设置有提取码, 无法设置为无提取码的分享.本文将教你怎么绕过百度设置无提取码的分享(即公开的), 一行代码搞定!
- Linux 配置redis 开机自动启动
- 51 单片机学习_1.2 LED闪烁
- User authentication center of micro service
猜你喜欢

Deletion of linked list nodes

电网企标B接口接入记录(二):资源上报

Ehcart map

Power grid enterprise standard B interface access record (II): resource reporting

Be sure to watch the nine steps of MES selection, which is worth collecting and watching repeatedly (Part 2)

Configure redis to start automatically on Linux

JVM——》CMS

autojs自动化脚本怎么在电脑上开发, 详细的靠谱教程!!!

Dapr | 云原生的抽象与实现

Taobao applet experience Optimization: data analysis and Optimization Practice
随机推荐
[reprint] explain Fourier transform in simple terms
signalr 控制台做服务端
关于组织申报2022年度山东省首台(套)技术装备及关键核心零部件项目的通知
MES and ERP need to be integrated to play a key role
基于知名微服务框架go-micro开发gRPC应用程序
最近发现百度云分享都要设置有提取码, 无法设置为无提取码的分享.本文将教你怎么绕过百度设置无提取码的分享(即公开的), 一行代码搞定!
31 drop down box codes of provinces, municipalities and autonomous regions directly under the central government
如果优雅最简单快速地将二维数组转换为一维数组, 或者将多维数组转换为一维数组
Introduction to microservices: ribbon and Nacos
51 single chip microcomputer learning_ 1.2 LED flashing
Ten classic problems and solutions in SIP voice environment
idea连接SqlServer报错
Dapr | abstraction and implementation of cloud native
神经网络学习之Opencv使用记录
Opencv图像处理之形态学操作
[nodejs] nodejs basic supplement (III) - this context object
Explain in simple terms the optimization of ext4 block and inode distributor (Part 2)
ssm+double 用redis实现三次登录,三次登录失败锁定五分钟
【ARM汇编判断】如何用汇编判断数组中正负数个数?
微服务之用户鉴权中心