深入理解 JS 垃圾回收

深入理解 JS 垃圾回收攻略

什么是垃圾回收?

垃圾回收是指删除不再使用的对象(以下简称“垃圾”),以释放内存空间。在 JavaScript 中,相当于销毁没被引用的对象。

如何判断对象是否需要回收?

JavaScript 引擎通过“标记清除”算法进行垃圾回收,它的基本思路是从根对象开始,找到所有已经被引用的对象,标记它们。然后清除所有未被标记的对象。

举个例子:

var a = { b: {} };
var c = a.b;
a = null;
c = null;

对于上述代码,当 a 被赋值为 null 时,a 所指向的对象(包括其中的 b 属性)都已经失去了引用,所以这些对象都会被回收。

如何优化垃圾回收?

避免全局变量

全局变量会一直存在,直到页面关闭,因此建议尽可能使用局部变量。

手动释放不必要的引用

如果一个大对象只使用了一部分,但仍然保留对该对象的引用,则其余部分也会一直保存在内存中。手动将不需要的引用释放掉,可以加快垃圾回收的速度。

举个例子:

function process(data) {
  // 使用 data 中的一小部分数据
}
var someData = loadData();
process(someData);
someData = null; // 手动释放引用

避免循环引用

循环引用指两个或多个对象相互引用,导致它们的引用计数永远不为零,无法被垃圾回收器回收。可以通过断开循环引用来解决这个问题,比如将其中一个对象的引用设为 null。

举个例子:

function func() {
  var objA = {};
  var objB = {};
  objA.ref = objB;
  objB.ref = objA;
  // 使用 objA 和 objB
}
func();

上述代码中,objA 和 objB 彼此相互引用,导致它们都无法被垃圾回收器释放。可以将其中任意一个对象的引用设为 null,打破循环引用即可。

如何监控垃圾回收?

由于垃圾回收是 JavaScript 引擎自动处理的,我们无法直接监控它。但是,可以通过调用 performance.memory 的相关方法获取内存信息,间接地监控垃圾回收情况。

var usedJSHeapSize = performance.memory.usedJSHeapSize;
var totalJSHeapSize = performance.memory.totalJSHeapSize;
var jsHeapSizeLimit = performance.memory.jsHeapSizeLimit;

上述代码中,usedJSHeapSize 表示当前使用中的内存大小,totalJSHeapSize 表示可用的内存总大小,jsHeapSizeLimit 表示分配给 JavaScript 的最大内存。

示例

下面给出一个示例,演示如何通过手动释放不必要的引用来优化垃圾回收:

function func() {
  var arr = [];
  for (var i = 0; i < 1000000; i++) {
    arr.push({ key: 'value' + i });
  }
  return arr.slice(0, 10); // 只使用数组中的前10个对象
}
var result = func();
// 手动释放除了result数组以外的arr数组中的元素
var arr = result.concat();
result = null;
for (var i = 0; i < arr.length; i++) {
  arr[i] = null;
}
arr = null;

在上图的第一个断点处,对于 GC,它必须扫描整个 400 MB 的内存,才能知道 a 都已经失去了引用,可以被释放。在第二个断点处,由于手动释放了不必要的引用,GC 只需扫描 10 MB 的内存即可完成垃圾回收,大大提高了回收效率。

这只是优化垃圾回收的其中一个示例,总体来说,优化垃圾回收需要结合实际情况进行思考、设计。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解 JS 垃圾回收 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • 10大Js图像处理库

    10大Js图像处理库攻略 在本文中,我们将介绍10种常用的Js图像处理库,它们可以帮助我们快速处理图片。我们将会分别介绍它们的特点以及使用场景,并提供相应的例子供大家参考。 1. Fabric.js Fabric.js是一个拥有丰富的图形绘制和图像处理功能的canvas库。它提供了很多接口可以方便地操作canvas对象,提供的功能包括叠加、截图、缩放、裁剪等…

    node js 2023年6月8日
    00
  • node.js中的fs.chmodSync方法使用说明

    下面我就来为你详细讲解一下“node.js中的fs.chmodSync方法使用说明”的攻略。 标题 Node.js中的fs.chmodSync方法使用说明 简介 在Node.js的fs模块中,fs.chmodSync方法可以用来同步修改文件或目录的权限。该方法接受两个参数,分别是要修改权限的文件或目录的路径和最新的权限模式(mode)。权限模式是一个八进制数…

    node js 2023年6月8日
    00
  • javascript实现的DES加密示例

    下面是“javascript实现的DES加密示例”的完整攻略,希望对您有帮助。 什么是DES加密 DES(Data Encryption Standard)是一种对称加密算法,在数字加密中广泛使用。它的密钥长度为8个字节,有64位明文输入块长度,64位密文输出块长度。 javascript实现DES加密 在JavaScript中实现DES加密可以使用Cryp…

    node js 2023年6月8日
    00
  • Vue指令工作原理实现方法

    Vue 指令是 Vue 模板中的特殊语法,它们以 v- 开头,用于对元素、组件或者DOM元素进行特定的绑定和操作。例如,v-for 用于循环渲染列表数据,v-if 用于条件渲染,v-bind 用于动态绑定属性等等。 Vue 指令的工作原理是基于 Vue.js 内部解析模板时实现的。当 Vue.js 开始执行编译模板的过程时,会将模板转换为虚拟 DOM 树,并…

    node js 2023年6月8日
    00
  • 简单好用的nodejs 爬虫框架分享

    简单好用的 Node.js 爬虫框架分享 什么是爬虫框架 爬虫框架是一种编程工具,用于提取互联网上的信息。它是由数据抓取器、页面解析器、数据存储器等模块组成。一般情况下,它们帮助我们抓取一些网站的数据,分析并将它们存储到我们需要的地方。使用爬虫可以让我们快速地获取大量数据并进行分析。 Node.js 爬虫框架 Node.js爬虫框架是一个美妙的选择,因为它是…

    node js 2023年6月8日
    00
  • node.js中express中间件body-parser的介绍与用法详解

    下面是本攻略的完整内容,包括介绍、用法以及代码示例。 介绍 在 Node.js 的 Web 开发中,处理请求参数是非常常见的操作。其中,body-parser 是一个非常常用的中间件,它用来解析 HTTP 请求体中的参数,并挂载到 request 对象上供后续中间件或路由处理。 body-parser 中间件支持多种格式的请求体数据,包括 JSON、urle…

    node js 2023年6月8日
    00
  • Nodejs中获取当前函数被调用的行数及文件名详解

    对于Node.js中获取当前函数被调用的行数及文件名这个问题,我们可以通过调用Node.js的Error对象来实现这个功能。下面就是一个完整的攻略: 使用Error对象获取当前函数被调用的行数及文件名 我们可以在函数内部手动抛出一个错误,然后利用这个错误,获取到这个错误对象的stack属性,从而获取到被调用函数所在的文件名和行数。示例代码如下: functi…

    node js 2023年6月8日
    00
  • nodejs中使用archive压缩文件的实现代码

    要在 Node.js 中使用 Archive 压缩文件,我们可以使用 node-archiver 库。该库提供了一组简单的 API,可以方便地进行压缩文件操作。 以下是使用 node-archiver 压缩文件的步骤: 步骤 1:安装 node-archiver 库 在终端或命令提示符中,使用以下命令安装 node-archiver: npm install…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部