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)最后,垃圾收集器完成内存清除工作,销毁那些带标记的值,并回收他们所占用的内存空间。
引用计数法:文章来源:https://www.toymoban.com/news/detail-673884.html
机制就是跟踪一个值的引用次数,当声明一个变量并将一个引用类型赋值给该变量时该值引用次数加1,当这个变量指向其他一个时该值的引用次数便减一。当该值引用次数为0时,则说明没有办法再访问这个值了,被视为准备回收的对象,每当过一段时间开始垃圾回收的时候,就把被引用数为0的变量回收。引用计数方法可能导致循环引用,类似死锁,导致内存泄露。文章来源地址https://www.toymoban.com/news/detail-673884.html
到了这里,关于关于js的内存管理和垃圾回收机制的理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!