浅谈垃圾回收机制

简介: 浅谈垃圾回收机制

前言:


JavaScript的垃圾回收机制是为了防止内存泄漏的,所谓的内存泄漏是指当已经不需要某块内存时这块内存还存在着,而垃圾回收机制就是间歇的不定期的寻找到不再使用的变量,并释放掉它们所指向的内存。

举个例子:我写了一个函数,在这个函数里面我声明了一个局部变量,那么当这个函数运行完了其实这个变量我们就不需要了,我们不会在乎这个变量还存不存在,反正我们已经用完了。那么如果这个变量我们实实在在的不用了但是它却不能被回收,为什么不能被回收呢?因为内存泄漏了,下一篇文章我会详细聊聊内存泄漏的问题。

1.标记清除(主要)


先明确一个点,是谁在回收,即,谁是垃圾回收的主体?答案是JavaScript。

有两种垃圾回收机制,标记清除和引用计数,先说说标记清除。

当变量进入执行环境的时候,比如说函数声明一个变量,那么这个时候变量被标记为“进入环境”,当函数执行结束后,变量被标记为“离开环境”,也就是说函数运行完了,这个变量也就被清理了。

然后,对于JavaScript来说,它的执行是,给内存中中的所有变量打上标记(可理解为我要删除得有个名单),先除去正在运行的变量,可理解为这个函数正在执行中,还有就是闭包,可理解为这个变量正在被引用(使用),除了这两个情况,其他的就会被回收。

image.png

2.引用计数(次要)


这个方式很简单,意思是说我要跟踪记录这个变量的引用次数,当它变成0的时候就被清理。

具体的规则如下:

比方说我声明一个变量,将一个引用类型(如对象)赋值给该变量的时候这个值的引用次数加一,如果这个变量的值变成另外一个,那么这个引用次数减一,当这个值的引用次数为0的时候,说明没有变量被使用了,于是这个值就被回收掉了

3.一些注意的点


BOM和DOM是通过引用计数回收垃圾的,也就是说只要涉及BOM和DOM就会出现循环引用的问题

相关文章
|
缓存
如何清除keep-alive缓存
如何清除keep-alive缓存
873 6
|
PyTorch 算法框架/工具
更换Anaconda的下载源为国内源的办法
更换Anaconda的下载源为国内源的办法
4414 0
|
11月前
|
XML JavaScript Java
SpringBoot集成Shiro权限+Jwt认证
本文主要描述如何快速基于SpringBoot 2.5.X版本集成Shiro+JWT框架,让大家快速实现无状态登陆和接口权限认证主体框架,具体业务细节未实现,大家按照实际项目补充。
801 11
|
消息中间件 存储 Java
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
Android 消息处理机制估计都被写烂了,但是依然还是要写一下,因为Android应用程序是通过消息来驱动的,Android某种意义上也可以说成是一个以消息驱动的系统,UI、事件、生命周期都和消息处理机制息息相关,并且消息处理机制在整个Android知识体系中也是尤其重要,在太多的源码分析的文章讲得比较繁琐,很多人对整个消息处理机制依然是懵懵懂懂,这篇文章通过一些问答的模式结合Android主线程(UI线程)的工作原理来讲解,源码注释很全,还有结合流程图,如果你对Android 消息处理机制还不是很理解,我相信只要你静下心来耐心的看,肯定会有不少的收获的。
848 3
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
|
Web App开发
让Chrome支持小于12px 的文字方式有哪些?区别?
让Chrome支持小于12px 的文字方式有哪些?区别?
268 0
|
C# 图形学
Winform控件优化之Paint事件实现圆角组件(提取绘制圆角的扩展方法)
Paint事件方法中实现圆角控件不要通过事件参数`e.ClipRectangle`获取控件区域范围,原因见最后介绍;注意设置控件背景透明(参见[Winform控件优化之背景透明那些事2...
1096 0
Winform控件优化之Paint事件实现圆角组件(提取绘制圆角的扩展方法)
|
XML JSON 数据安全/隐私保护
如何使用Fiddler抓取APP接口和微信授权网页源代码
Fiddler是一款强大的抓包工具,用于捕获HTTP/HTTPS流量,包括手机APP和微信授权页面的数据。下载安装Fiddler后,需设置电脑代理,如端口8888,并在手机上配置相同代理,确保两者在同一局域网。通过安装Fiddler证书,可解密HTTPS请求。在手机上打开目标应用或网页,Fiddler将显示请求详情,便于接口调试和数据查看。
859 0
如何使用Fiddler抓取APP接口和微信授权网页源代码
|
SQL 运维 数据管理
sql管理工具archery简介
Archery是一个多公司采用的SQL管理工具,提供权限管理、工作流配置、实例管理、SQL审核、查询、优化及通知功能。它支持多级审批和不同云环境的数据管理。尝试Archery的SaaS版本可访问[ArcheryDMS.com](https://archerydms.com/home/)。此外,NineData是一个综合平台,包含SQL开发、数据复制等功能,适应混合云和多云环境,由叶正盛创建,详情见[Ninedata.cloud](https://www.ninedata.cloud/aboutus)。
899 0
|
小程序 JavaScript 前端开发
微信小程序授权登陆 getUserProfile
微信小程序授权登陆 getUserProfile
487 0
|
存储 安全 Java
简单聊聊copy on write(写时复制)技术
简单聊聊copy on write(写时复制)技术