介绍一下js垃圾回收机制
JavaScript中的垃圾回收机制负责自动管理内存,回收不再使用的对象所占用的内存空间。在JavaScript中,开发者不需要显式地分配和释放内存,垃圾回收器会自动完成这些操作。以下是关于JavaScript垃圾回收机制的一些关键概念:
1. 内存生命周期:JavaScript内存生命周期包括分配、使用和释放三个阶段。首先,内存会被分配给变量或对象;然后,程序会使用这些变量或对象;最后,不再需要的变量或对象会被垃圾回收器释放。
2. 可达性:垃圾回收器通过可达性来判断一个对象是否还在使用。根对象(如全局对象和其他内置对象)被认为是可达的。如果一个对象可以通过根对象或其他可达对象引用链到达,那么它也被认为是可达的。
3. 引用计数:这是一种较早的垃圾回收策略,通过追踪每个对象的引用次数来判断对象是否仍在使用。当对象的引用计数为0时,表示对象不再被使用,可以被回收。然而,引用计数算法存在循环引用问题,无法回收循环引用的对象。
4. 标记-清除:这是现代JavaScript引擎中常见的垃圾回收算法。标记-清除算法首先会标记所有可达对象,然后遍历整个内存空间,清除未被标记的对象。这种算法可以处理循环引用问题,但可能会导致内存碎片。
5. 分代回收:由于不同对象的生命周期长短不同,现代JavaScript引擎将内存分为新生代和老生代。新生代主要存放短生命周期的对象,老生代主要存放长生命周期的对象。新生代和老生代的垃圾回收策略会有所不同。
6. 增量回收和懒惰回收:为了降低垃圾回收对程序执行的影响,现代JavaScript引擎采用了增量回收和懒惰回收策略。增量回收将回收工作分成多个小任务,穿插在程序执行过程中;懒惰回收则会在一定程度上推迟回收操作,以减少性能开销。
以下是一个简单的示例,演示了 JavaScript 垃圾回收机制中的引用计数和标记清除:
// 引用计数示例
let a = { name: 'John' };
let b = a; // b 引用了 a,a 的引用计数变为 2
a = null; // a 不再引用这个对象,a 的引用计数变为 1
b = null; // b 不再引用这个对象,这个对象的引用计数变为 0,可以被垃圾回收器回收 // 标记清除示例
function foo() {
let x = { name: 'Alice' };
let y = { name: 'Bob' };
x.friend = y;
y.friend = x;
} foo(); // 函数执行完后,x 和 y 都不再被使用,但它们之间相互引用,无法使用引用计数来回收内存
// 垃圾回收器定期运行,会发现 x 和 y 都已经不再被引用,可以被回收
在这个示例中,当变量 a 被赋值给变量 b 时,对象的引用计数变为 2。当 a 被赋值为 null 时,对象的引用计数变为 1。最后当 b 也被赋值为 null 时,对象的引用计数变为 0,可以被垃圾回收器回收。
另外,函数 foo 中创建了两个对象 x 和 y,并且它们相互引用。在函数执行完后,这两个对象不再被使用,但它们之间的引用关系无法使用引用计数来回收内存。因此,垃圾回收器会定期运行,查找那些已经不再被引用的对象,然后释放它们所占用的内存空间。
再来一个例子,我们将创建一些对象并解释JavaScript的垃圾回收机制。
// 创建对象
function createPerson(name, age) {
return {
name: name,
age: age,
};
} // 创建两个对象
let person1 = createPerson("Alice", 30);
let person2 = createPerson("Bob", 35); // person1 和 person2 变量引用了两个新创建的对象,这些对象在内存中是可达的 // 现在将 person1 引用另一个对象
person1 = createPerson("Charlie", 28); // 之前 person1 引用的 "Alice" 对象现在已经不再可达,因为没有变量引用它
// JavaScript的垃圾回收器会识别到这一点,并在合适的时机释放其内存 // 创建一个循环引用
let objA = {
name: "ObjA",
};
let objB = {
name: "ObjB",
};
objA.link = objB;
objB.link = objA; // 将变量设置为 null,打破可达性
objA = null;
objB = null; // 现在 objA 和 objB 对象都不再可达,即使它们彼此引用
// 使用标记-清除算法的垃圾回收器会识别到这一点,并释放它们占用的内存
在这个例子中,我们创建了几个对象并对它们进行了引用。当一个对象不再可达时,它就成为了垃圾回收的目标。对于循环引用的情况,标记-清除算法可以识别到并正确处理这种情况,释放不再使用的对象所占用的内存。
注意:不同的JavaScript引擎可能采用不同的垃圾回收策略,如V8、SpiderMonkey和JavaScriptCore等。
介绍一下js垃圾回收机制的更多相关文章
- 前端面试:谈谈 JS 垃圾回收机制
摘要: 不是每个人都回答的出来... 最近看到一些面试的回顾,不少有被面试官问到谈谈JS 垃圾回收机制,说实话,面试官会问这个问题,说明他最近看到一些关于 JS 垃圾回收机制的相关的文章,为了 B 格 ...
- python垃圾回收机制:引用计数 VS js垃圾回收机制:标记清除
js垃圾回收机制:标记清除 Js具有自动垃圾回收机制.垃圾收集器会按照固定的时间间隔周期性的执行. JS中最常见的垃圾回收方式是标记清除. 工作原理 当变量进入环境时,将这个变量标记为"进入 ...
- 谈谈 JS 垃圾回收机制
谈谈 JS 垃圾回收机制 JS内存泄漏与垃圾回收机制 https://javascript.info/garbage-collection
- 浅尝js垃圾回收机制
局部作用域内的变量,在函数执行结束之后就会被js的垃圾回收机制销毁 为什么要销毁局部变量? => 为了释放内存 js垃圾回收机制何时会销毁局部变量 : 如果局部变量无法再得到访问,就会被 ...
- 闭包内的微观世界和js垃圾回收机制
一.什么是闭包? 官方”的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.相信很少有人能直接看懂这句话,因为他描述的太学术.其实这句话 ...
- js 垃圾回收机制和引起内存泄漏的操作
垃圾回收机制 JS中最常见的垃圾回收方式是标记清除. 工作原理:是当变量进入环境时,将这个变量标记为“进入环境”.当变量离开环境时,则将其标记为“离开环境”.标记“离开环境”的就回收内存. 工作流程: ...
- 理解闭包的微观世界和JS垃圾回收机制
function a() { ; function b() { alert(++i); } return b; } var c = a(); c(); 一.闭包的微观世界 如果要更加深入的了解闭包以及 ...
- v8垃圾回收和js垃圾回收机制
垃圾回收器是一把十足的双刃剑.好处是简化程序的内存管理,内存管理无需程序员来操作,由此也减少了长时间运转的程序的内存泄漏.然而无法预期的停顿,影响了交互体验.本文从 V8 (node.js runti ...
- 关于JS垃圾回收机制
一.垃圾回收机制的必要性 由于字符串.对象和数组没有固定大小,所以当它们的大小已知时,才能对它们进行动态的存储分配.JavaScript程序每次创建字符串.数组或对象时,解释器都必须分配内存来存储那个 ...
- js垃圾回收机制
垃圾回收机制,简称GC(garbage collection),会定期(周期性)地回收那些不再使用的变量,然后释放其内存. 而内存占用的情况有很多: 1.变量 2.字面量对象声明:var obj = ...
随机推荐
- Mongodb+Stadio 3
一.安装Mongodb https://www.mongodb.com/download-center/community 请下载对应的系统 安装过程请不要选择 当所有的步骤值完成的时候,找到你的安 ...
- python2 selenium
参考blog: https://www.cnblogs.com/xiaozhiblog/p/5378723.html http://www.cnblogs.com/fnng/ 一.项目结构介绍 下面逐 ...
- 【git入门】基于阿里云搭建git
本文旨在说明基本的git使用流程,分为以下几个部分: 1.安装git环境 2.注册 3.git基本操作 一.安装git环境 第一次使用git,需要先安装配置git环境,windows版下载地址http ...
- Navicat 连接MySQL数据库 报错2059
Navicat 连接MySQL数据库 报错2059 - authentication plugin 'caching_sha2_password'的解决办法 2059 - Authentication ...
- Leecode 88.合并两个有序数组
想法: 1:先把nums2中的所有元素都放到nums1,之后给合并后的数组排序 1 官方代码: 2 class Solution { 3 public void merge(int[] nums1 ...
- NX二次开发获取当前DLL路径函数
string GetPath();//输出程序路径 string YiNingToolPath(string DLLDir); //分割程序路径获取工具目录 HMODULE GetSelfModule ...
- [Unity框架]资源管理02:热更新
这里可以分成资源打包.资源更新下载.资源加载卸载3个部分 一.资源打包 参考链接: https://blog.uwa4d.com/archives/TechSharing_59.html https: ...
- vue element表格合计问题
vue element计算表格合计问题 问题:当表格的el-table-column标签下的属性prop属性值为'对象.属性'时,将不能自动合计.例如: <el-table border v-l ...
- Spring简介-IOC
目录 1.Spring 1.1.简介 1.2.优点 1.3.组成 1.4.扩展 2.IOC理论推导 1.Spring 1.1.简介 Spring:春天----------->给软件行业带来了春天 ...
- 《程序员的自我修养》学习笔记——ELF 文件结构介绍【第二弹】
ELF 文件结构介绍 文件头 以 ELF 文件64位版本为例: e_ident [ELF魔数 16byte] 1-4字节:ELF 文件都必须相同的标识码,分别为 0x7F,0x45,0x4C,0x46 ...