JavaScript中的内存管理

70 阅读3分钟

前言

随着近些年硬件技术的不断发展,高级编程语言当中也都自带了 GC 机制,所以这样的一些变化就让我们在不需要特别注意内存空间使用的情况下,也能够去正常的完成相应的功能开发

那么为什么我们在这里一定要注意内存管理呢

下面我们通过非常简单的代码来说明

function fn() {
    arrs = [];
    arrs[10000] = 'i am coding'
}
fn();

首先我们在这里定义了一个普通函数fn,然后我们在函数体内声明一个数组,之后我们给数组赋值,需要注意的就是我们在赋值的时候刻意选择了一个比较大的数字来作为下标。这样的目的也就是为了当前函数在调用的时候可以向我们的内存申请一片比较大的空间,我们执行以上的代码时,从语法上来说是没有任何问题的。

微信截图_20231112202012.png

但当我们使用 Chrome 的 Performance 来监测执行过程中内存变化时,我们会发现他的内存变化就跟我们上图中的蓝色线条一样,在持续升高,在这个过程当中并没有看到回落,那么代表着什么呢,这就是内存泄漏

如果说我们在写代码的时候不够了解内存管理的一些机制,那么我们就有可能编写出一些不易察觉的内存问题型代码,这种代码多了以后,就会页面卡顿甚至内存崩溃,所以掌握内存的管理非常有必要

介绍

  • 内存:由可读写单元组成,表示一片可操作空间
  • 管理:人为的去操作一片空间的申请、使用和释放
  • 内存管理:开发者主动申请、使用空间、释放空间

和其他语言一样,也是分这三步: 申请-使用-释放。但由于 JavaScript 语言中并没有提供的相应操作 api ,所以不能像 C 或者 C++ 语言由开发者主动的去调用 api 完成空间的管理,不过即使如此我们也可以通过 JavaScript 来演示当前在内部空间的生命周期是怎样完成的

请看一下代码:

// 申请空间
// 在JavaScript中并没有提供直接的操作api,我们只能在JavaScript引擎遇到变量定义语句的时候自动分配给我们一个相应的空间,所以这个步骤相当于是定义变量
let obj = {}

// 使用,也就是读写操作

obj.name = 'xxx'

// 释放
// JavaScript中也没有相应的释放内存的api,所以我们使用一个间接的方式
obj = null;

内存管理的目标是有效地利用计算机的内存资源,以避免内存泄漏和内存溢出等问题

内存泄漏指的是未释放不再使用的内存,导致内存占用不断增加,最终导致系统性能下降。而内存溢出则是指申请的内存超过了系统可用的内存大小,导致程序崩溃或异常终止。

结束

通过上面的介绍,相信大家对内存管理已经有了初步了解

祝大家变得更强!