深入理解 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日

相关文章

  • node连接mysql数据库遇到的问题和解决方案

    当使用Node连接MySQL数据库时,可能会遇到以下问题: 1.无法连接到数据库2.查询时出现错误3.无法处理回调函数 接下来我将分享一些解决这些问题的方法: 问题1:无法连接到数据库 当使用Node连接MySQL数据库时,可能会遇到无法连接到数据库的问题。出现这种情况可能是由于以下原因: 1.数据库已关闭2.重复的连接3.防火墙阻止了连接 下面是一个示例,…

    node js 2023年6月8日
    00
  • 13 个npm 快速开发技巧(推荐)

    13 个npm 快速开发技巧(推荐)攻略 1. 使用 npx 执行命令 npx 是 Node.js 5.2.0 版本中新增的命令,用来执行本地安装的模块。与 npm 命令不同的是,它可以直接执行 npm 仓库中的模块,而无需本地安装。 例如,如果你想要使用 json-server 来创建一个假的 API 服务器,只需运行如下命令即可: npx json-se…

    node js 2023年6月8日
    00
  • 详解Node.js 中使用 ECDSA 签名遇到的坑

    详解Node.js 中使用 ECDSA 签名遇到的坑 什么是ECDSA ECDSA,全称椭圆曲线数字签名算法(Elliptic Curve Digital Signature Algorithm),是一种基于椭圆曲线密码学的签名算法。与传统的RSA、DSA等算法相比,ECDSA在强度和速度方面都有很大的优势。 Node.js中使用ECDSA签名 在Node.…

    node js 2023年6月8日
    00
  • Node.js API详解之 console模块用法详解

    Node.js API详解之 console模块用法详解 简介 首先,Node.jsConsole 模块提供了一个简单的调试控制台,类似于 Web 浏览器提供的 JavaScript 控制台。 Console 模块中提供了许多有用的方法,可以用于打印和调试 Node.js 应用程序。 安装 Node.js console 模块是默认安装的,所以您只需要导入即…

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

    当在Node.js中读写文件或流时,通常需要关闭文件以释放与其相关的资源。fs.close方法可以用于关闭文件。 方法说明 fs.close方法用于关闭一个已经打开的文件。它的语法如下: fs.close(fd, callback) 其中,fd是文件描述符,它指向一个已经打开的文件。callback是一个回调函数,当文件关闭完成时被调用。该方法没有返回值。 …

    node js 2023年6月8日
    00
  • nodejs处理图片的中间件node-images详解

    Node.js处理图片的中间件node-images详解 什么是node-images node-images 是Node.js运行环境下的一个轻量级图片处理中间件,它可以在Node.js中进行图片的读取、缩放、裁剪、压缩等操作。 安装 在项目中使用 npm 命令进行安装 npm i images 基本使用 读取图片 const images = requi…

    node js 2023年6月8日
    00
  • Node.js queryString 解析和格式化网址查询字符串工具使用

    关于“Node.js queryString 解析和格式化网址查询字符串工具使用”的完整攻略,以下是详细讲解。 什么是查询字符串 在浏览器中,我们经常会看到地址栏中带有问号的网址,这部分网址就是查询字符串。查询字符串一般用于向服务器传递参数,而查询字符串的解析和格式化就是Node.js queryString模块的核心功能。 查询字符串的格式一般为key=v…

    node js 2023年6月8日
    00
  • 解决Node.js mysql客户端不支持认证协议引发的问题

    问题描述 在使用 Node.js MySQL 客户端时,可能会遇到以下错误: Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client 这个错误发…

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