JavaScript性能优化 - JS 内存管理 Memory Management

103 阅读3分钟

随着近些年硬件技术的不断发展,同时高级编程语言当中也都自带了 GC 机制。所以这样一些变化,就让开发者不需要特别注意内存空间使用的情况下也能够去正常的完成相应的功能开发。为什么在这里还要重提内存管理呢?下面就通过一段极简单的代码进行说明:这里 fn 函数在调用的时候会向内存尽可能多的申请一片比较大的空间。然后在执行这个函数过程中其实从语法上来说,它是不存在任何类型的问题的。但是当我们用一个相应的性能检测工具在这个脚本执行过程中对它的内存进行监控的时候,会发现它的内存变化就跟当前图示中所看到的蓝色线条一样。它是持续升高的,在这个过程当中并没有看到回落。这代表着内存泄露,如果说在写代码的时候不够了解内存管理的一些机制,从而就会编写出一些不容易察觉到的内存问题性代码。像这种代码多了以后给程序带来的,可能就是一些意想不到的 BUG 。所以掌握内存的管理,还是非常有必要的。

function fn () {
    arrlist = [];
    arrlist[100000] = 'lg is a coder';
}
fn()

什么是内存管理 ?

从当前这样一个词语本身来说,内存就是由可读写的单元组成,表示一片可操作空间;管理就是由人主动的去操作一片空间的申请、使用和释放,即使我们借助了一些 API 但终归来说我们可以自主的去做一个这样的事情;所以内存管理就是开发者可以主动的去向内存来申请空间、使用空间、释放空间,因此这个流程也就显得非常简单了。一共有三步:申请 - 使用 - 释放。

在 JS 中是如何完成内存管理的 ?

和其他语言是一样的,它也是分三步来执行这样一个过程。但是由于 ES 当中并没有提供相应的 操作 API ,所以它不能向 C、C++ 那样🈶️开发者主动的去调用相应的 API 完成相应的空间管理。不过即使如此,它也不能影响我们去通过 JS 脚本来演示当前在内部一个空间的生命周期是怎样完成的。在 JS 当中由于并没有直接提供相应的操作 API ,所以就只能是在 JS 执行引擎去遇到变量定义语句的时候自动分配相应的空间。所以在申请空间阶段,就是直接定义一个变量;使用空间其实就是对变量的读写操作,比如赋值操作;空间释放操作在 JS 中同样也没有相应的释放操作 API ,所以在这可以采用一种间接的方式,比如将对象变量设置为 null。

// 内存空间的声明周期
// 申请空间
let obj = {}
// 使用空间
obj.name = 'leo'
// 释放空间
obj = null

以上就相当于是按照内存管理的一个流程在 JS 当中去实现了这样一个内存管理。