返回

JS内存分配和垃圾回收原理:图解式学习

前端

前言

JavaScript是一种单线程脚本语言,这意味着它一次只能执行一个任务。为了保证JavaScript代码的执行效率,V8引擎采用了一种非常高效的内存分配和垃圾回收机制。本文将通过图解和实验的方式带大家重新理解一遍JS内存分配和垃圾回收原理,希望能够加深你对这部分知识的理解和记忆。

内存分配

在JavaScript中,内存分配主要分为两种类型:栈内存分配和堆内存分配。

  • 栈内存分配 :栈内存是连续的一块内存区域,它主要用于存储基本数据类型(如数字、字符串、布尔值)和局部变量。栈内存分配速度很快,但它有一个缺点,就是一旦变量超出其作用域,它就会被释放。
  • 堆内存分配 :堆内存是非连续的一块内存区域,它主要用于存储对象和数组。堆内存分配速度较慢,但它有一个优点,就是只要对象和数组还被引用,它们就不会被释放。

垃圾回收

在JavaScript中,垃圾回收是指自动释放不再被引用的内存空间的过程。垃圾回收由V8引擎的垃圾回收器负责。垃圾回收器会定期扫描堆内存,并将不再被引用的对象和数组释放。

JS内存分配和垃圾回收原理图解

以下是一张图解,展示了JS内存分配和垃圾回收原理:

[图片]

实验

我们可以通过一个简单的实验来验证JS内存分配和垃圾回收原理。

function test() {
  var a = 1;
  var b = 2;
  var c = 3;
}

test();

在上面的代码中,我们定义了一个函数test(),并在函数内部定义了三个变量a、b和c。当我们调用函数test()时,这三个变量就会被分配到栈内存中。当函数test()执行完毕后,这三个变量就会被释放。

我们可以使用Chrome DevTools来查看内存分配和垃圾回收的情况。在Chrome DevTools中,我们可以看到堆内存和栈内存的使用情况。

[图片]

从图中我们可以看到,在函数test()执行之前,堆内存和栈内存都是空的。当函数test()执行后,堆内存和栈内存都会增加。当函数test()执行完毕后,栈内存中的变量会被释放,堆内存中的对象和数组也会被释放。

总结

通过本文的学习,我们已经对JS内存分配和垃圾回收原理有了更深入的了解。希望本文能够对你有帮助。

拓展阅读