关于js的内存管理和垃圾回收机制的理解

本文详细介绍了JavaScript的内存管理,包括基本类型和引用类型的内存分配,重点讲解了V8引擎的作用以及其在Node.js中的应用。此外,文章还探讨了垃圾回收机制,如标记清除法和引用计数法,以及它们如何确保内存的有效管理和避免内存泄漏。
摘要由CSDN通过智能技术生成

js的内存管理:

内存管理,顾名思义,js在创建变量时,会在内存中分配空间,来储存新增的变量,其中有两种方式,

1:基本类型,系统会在内存中分配实实在在的内存空间,来存放新增的变量,存储的数据结构为栈

2:引用类型,函数,对象等,系统也会在内存中分配空间来储存,存储的数据结构为堆,同时还会在栈中存储堆内对应的地址,指向堆中的对象和函数。

对于栈的内存空间,只保存简单数据类型的内存,由操作系统自动分配和自动释放。而堆空间中的内存,由于大小不固定,系统无法无法进行自动释放,这个时候就需要JS引擎(V8)来手动的释放这些内存。

由于js为解释性语言,所以需要有解释引擎,将js转化为机器语言(越过了字节码),通常我们使用的解释引擎为  V8引擎

V8引擎(关键):

V8引擎是驱动 Google Chrome 的 JavaScript 引擎的名称。是 Chrome浏览器和edge浏览器获取我们的 JavaScript 代码并执行代码的东西。

V8 提供了 JavaScript 执行的运行时环境。 DOM 和其他 Web 平台 API 由浏览器提供。

JavaScript 引擎独立于它所在的浏览器。 这个关键特性促成了 Node.js 的兴起。 早在 2009 年,V8 就被选为驱动 Node.js 的引擎,随着 Node.js 的流行,V8 成为现在为大量使用 JavaScript 编写的服务器端代码提供驱动的引擎。

Node.js 底层代码主要是为C++,这个跟后续内容有关。Node.js生态系统非常庞大,这要归功于 V8,它还支持桌面应用程序,例如 Electron 等项目。

其它JS引擎:

        Firefox 使用 SpiderMonkey

        Safari 使用 JavaScriptCore(也称为 Nitro)

        Edge 最初基于 Chakra,但现在已经使用 Chromium 和 V8 引擎重建。

        等等其它引擎

        所有引擎都采用ECMA ES-262 标准,即 ECMAScript(JavaScript 使用的标准)。

js垃圾回收机制:

js的垃圾回收是自动进行的,程序员无需过多关心,但是编写代码时,应尽量减少闭包和定时器造成的内存泄漏,浪费内存空间。JavaScript有自己的垃圾回收机制,JavaScript的解释器可用检测到何时程序不再使用一个对象,当确定了一个对象无用的时候,就说明不再需要这个对象了,就可用把这个对象所占用的内存释放掉。

标记清除法:

(1)当变量进入执行环境时(函数中声明变量),就标记这个变量为“进入环境”,当变量离开环境时(函数执行结束),则将其标记为“离开环境”,离开环境之后还有的变量则是需要被删除的变量。

(2)垃圾回收器在运行的时候会给存储在内存中的所有变量都加上标记。

(3)去掉环境中的变量以及被环境中变量引用的变量的标记。

(4)之后再被加上标记的变量即是需要回收的变量(因为环境中的变量已经无法访问到这些变量)

(5)最后,垃圾收集器完成内存清除工作,销毁那些带标记的值,并回收他们所占用的内存空间。
 

引用计数法:

机制就是跟踪一个值的引用次数,当声明一个变量并将一个引用类型赋值给该变量时该值引用次数加1,当这个变量指向其他一个时该值的引用次数便减一。当该值引用次数为0时,则说明没有办法再访问这个值了,被视为准备回收的对象,每当过一段时间开始垃圾回收的时候,就把被引用数为0的变量回收。引用计数方法可能导致循环引用,类似死锁,导致内存泄露。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值